{
  "$id": "https://protocol.automationcloud.net/schema.json",
  "domains": {
    "AccountApplication": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/message"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "applicant": {
          "typeRef": "#/domains/AccountApplication/types/Applicant"
        },
        "employment": {
          "typeRef": "#/domains/AccountApplication/types/Employment"
        },
        "options": {
          "typeRef": "#/domains/AccountApplication/types/Options",
          "default": {},
          "initial": true
        },
        "validationAccount": {
          "typeRef": "#/domains/AccountApplication/types/ValidationAccount"
        },
        "selectedBranch": {
          "typeRef": "#/domains/AccountApplication/types/Branch",
          "sourceOutputKey": "availableBranches",
          "inputMethod": "SelectOne"
        },
        "mobilePinConfirmation": {
          "typeRef": "#/domains/AccountApplication/types/MobilePinConfirmation"
        }
      },
      "outputs": {
        "availableBranches": {
          "typeRef": "#/domains/AccountApplication/types/Branches"
        },
        "confirmation": {
          "typeRef": "#/domains/AccountApplication/types/Confirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Applicant": {
          "type": "object",
          "description": "The person applying for the bank account.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "address": {
              "$ref": "#/domains/AccountApplication/types/Address"
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            },
            "countryOfBirth": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country of birth."
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "document": {
              "$ref": "#/domains/AccountApplication/types/IdentityDocument"
            }
          },
          "required": [
            "person",
            "dateOfBirth",
            "nationality"
          ],
          "additionalProperties": false
        },
        "Address": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "street": {
              "$ref": "#/domains/AccountApplication/types/Street"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "minLength": 1,
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [
            "city",
            "postcode"
          ],
          "additionalProperties": false
        },
        "Street": {
          "type": "object",
          "properties": {
            "prefix": {
              "type": "string",
              "description": "Calle",
              "minLength": 1
            },
            "name": {
              "type": "string",
              "description": "Romero Robledo"
            },
            "number": {
              "type": "string",
              "description": "56"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "description": "Applicant employment details.",
          "pii": true,
          "properties": {
            "companyName": {
              "type": "string",
              "minLength": 1
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "employed-fulltime",
                "employed-parttime",
                "unemployed",
                "autonomous",
                "self-employed",
                "on-benefits",
                "retired",
                "student"
              ]
            },
            "profession": {
              "type": "string",
              "description": "",
              "enum": [
                "others",
                "administrative",
                "in-charge",
                "manager",
                "intermediate-control",
                "military",
                "worker",
                "skilled-worker",
                "teacher",
                "advanced-technician",
                "commission-seller"
              ]
            },
            "activitySector": {
              "type": "string",
              "description": "",
              "enum": [
                "others",
                "public-administration",
                "travel-agencies",
                "agriculture",
                "food-and-tobacco",
                "furniture",
                "financial",
                "commerce",
                "communication",
                "building",
                "diplomats",
                "energy-and-water",
                "teaching",
                "shows",
                "electrical-electronic-manufacturing",
                "it-services",
                "engineering",
                "metallurgy",
                "military",
                "mining",
                "paper-and-graphic-arts",
                "fishing",
                "press",
                "vehicle-repair",
                "health",
                "domestic-services",
                "textile",
                "transport"
              ]
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "otherNetIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total of other earnings (after tax)."
            },
            "netIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total net salary (after tax)."
            },
            "otherIncomeSource": {
              "type": "string",
              "enum": [
                "others",
                "movable-capital",
                "real-estate-capital"
              ]
            },
            "payFrequency": {
              "type": "string",
              "enum": [
                "monthly",
                "weekly",
                "fortnightly",
                "four-weekly"
              ]
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        "Branches": {
          "type": "array",
          "description": "A list of available branches found on the website.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/AccountApplication/types/Branch"
          }
        },
        "Branch": {
          "type": "object",
          "description": "Branch information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "example": "MADRID-R. VICTORIA"
            },
            "address": {
              "type": "string",
              "example": "AV. REINA VICTORIA, 58"
            },
            "phoneNumber": {
              "type": "string",
              "example": "349121257151"
            }
          },
          "required": [
            "name"
          ]
        },
        "ValidationAccount": {
          "type": "object",
          "properties": {
            "number": {
              "type": "string",
              "example": "12121212121212"
            }
          },
          "required": [
            "number"
          ],
          "additionalProperties": false
        },
        "MobilePinConfirmation": {
          "type": "object",
          "description": "Mobile pin confirmation to confirm the applicant's mobile number.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "pin confirmation code.",
              "example": "12345678",
              "minLength": 3,
              "maxLength": 10
            }
          },
          "required": [
            "code"
          ],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Confirmation of the account.",
          "pii": true,
          "properties": {
            "message": {
              "type": "string",
              "description": "Confirmation message from the web page.",
              "example": "Your account is created."
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "AccountApplicationDeclined",
          "category": "client",
          "description": "Account application denied by Bank."
        },
        {
          "code": "MobilePinVerificationFailed",
          "category": "client",
          "description": "Pin verification failed."
        },
        {
          "code": "InvalidValidationAccountNumber",
          "category": "client",
          "description": "The validation account number is invalid, according to the supplier."
        }
      ]
    },
    "AdJob": {
      "description": "Internal domain for testing platform features.",
      "private": false,
      "inputs": {
        "options": {
          "typeRef": "#/domains/AdJob/types/Options",
          "description": "Used by service-api tests.",
          "default": {},
          "initial": true
        },
        "password": {
          "typeRef": "#/domains/AdJob/types/SomethingPrivate",
          "description": "Private/PII/Confidential."
        }
      },
      "outputs": {
        "object": {
          "typeRef": "#/domains/AdJob/types/Object"
        }
      },
      "types": {
        "Object": {
          "type": "object",
          "description": "An object of arbitrary structure."
        },
        "Options": {
          "type": "object",
          "description": "Flags for testing optional features.",
          "properties": {
            "flag": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "SomethingPrivate": {
          "type": "string",
          "description": "I contain some PII.",
          "pii": true,
          "example": "N/A"
        }
      },
      "errors": [
        {
          "code": "InternalError",
          "category": "server",
          "description": "AdJob error occurred"
        },
        {
          "code": "ClientError",
          "category": "client",
          "description": "Client caused error"
        }
      ]
    },
    "BicycleInsurance": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "bikes": {
          "typeRef": "#/domains/BicycleInsurance/types/Bikes"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "applicant": {
          "typeRef": "#/domains/BicycleInsurance/types/Applicant"
        },
        "directDebit": {
          "typeRef": "#/domains/BicycleInsurance/types/DirectDebit"
        },
        "selectedAddress": {
          "typeRef": "#/domains/BicycleInsurance/types/Address"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided."
        },
        "cover": {
          "typeRef": "#/domains/BicycleInsurance/types/SelectedOptions"
        },
        "coverStartDate": {
          "typeRef": "#/domains/BicycleInsurance/types/CoverStartDate"
        },
        "selectedPaymentMethod": {
          "typeRef": "#/domains/BicycleInsurance/types/PaymentMethod"
        },
        "optionalExtras": {
          "typeRef": "#/domains/BicycleInsurance/types/OptionalExtras"
        },
        "selectedPackage": {
          "typeRef": "#/domains/BicycleInsurance/types/Package"
        }
      },
      "outputs": {
        "coverValues": {
          "typeRef": "#/domains/BicycleInsurance/types/AvailableOptions"
        },
        "availablePackages": {
          "typeRef": "#/domains/BicycleInsurance/types/AvailablePackages"
        },
        "availablePaymentMethods": {
          "typeRef": "#/domains/BicycleInsurance/types/AvailablePaymentMethods"
        },
        "availableAddresses": {
          "typeRef": "#/domains/BicycleInsurance/types/AvailableAddresses"
        },
        "estimatedQuote": {
          "typeRef": "#/domains/BicycleInsurance/types/QuoteValue"
        },
        "quote": {
          "typeRef": "#/domains/BicycleInsurance/types/QuoteValue"
        },
        "documents": {
          "typeRef": "#/domains/BicycleInsurance/types/Documents"
        },
        "registrationDocs": {
          "typeRef": "#/domains/BicycleInsurance/types/Documents"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "confirmation": {
          "typeRef": "#/domains/BicycleInsurance/types/Confirmation"
        }
      },
      "types": {
        "Bikes": {
          "type": "array",
          "description": "An array of Bike objects.",
          "items": {
            "$ref": "#/domains/BicycleInsurance/types/Bike"
          },
          "minItems": 1
        },
        "Bike": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "road",
                "mountain",
                "hybrid",
                "electric",
                "folding"
              ]
            },
            "make": {
              "type": "string",
              "minLength": 1
            },
            "value": {
              "type": "string",
              "minLength": 1
            },
            "dateOfPurchase": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "condition": {
              "type": "string",
              "enum": [
                "new",
                "used"
              ]
            }
          },
          "required": [
            "type",
            "make",
            "value"
          ],
          "additionalProperties": false
        },
        "Applicant": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "type": "object",
              "description": "Basic information about person's identity.",
              "pii": true,
              "properties": {
                "title": {
                  "type": "string",
                  "description": "",
                  "enum": [
                    "mr",
                    "miss",
                    "ms",
                    "mrs"
                  ]
                },
                "firstName": {
                  "type": "string",
                  "description": "First name(s) or given name(s), as specified in ID.",
                  "minLength": 1,
                  "example": "Bob"
                },
                "lastName": {
                  "type": "string",
                  "description": "Last name or surname, as specified in ID.",
                  "minLength": 1,
                  "example": "Smith"
                },
                "dateOfBirth": {
                  "type": "string",
                  "format": "date",
                  "description": "Date of birth YYYY-MM-DD.",
                  "example": "1980-01-01"
                },
                "email": {
                  "type": "string",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "$ref": "#/domains/Generic/types/Phone"
                }
              },
              "required": [
                "title",
                "firstName",
                "lastName",
                "dateOfBirth",
                "email",
                "phone"
              ],
              "additionalProperties": false
            },
            "address": {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            }
          },
          "required": [
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "DirectDebit": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "sortCode": {
              "type": "string",
              "description": "Bank sort code",
              "pattern": "\\d{2}-?\\d{2}-?\\d{2}",
              "example": "56-00-29"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 8,
              "maxLength": 8,
              "description": "Cover marketing name as provided by the insurer.",
              "example": "26207729"
            },
            "accountName": {
              "type": "string",
              "minLength": 1
            },
            "bankName": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "sortCode",
            "accountNumber",
            "accountName",
            "bankName"
          ],
          "additionalProperties": false
        },
        "AvailablePaymentMethods": {
          "type": "array",
          "description": "An array of PaymentMethod objects.",
          "items": {
            "$ref": "#/domains/BicycleInsurance/types/PaymentMethod"
          },
          "minItems": 1
        },
        "PaymentMethod": {
          "oneOf": [
            {
              "$ref": "#/domains/BicycleInsurance/types/PaymentMethodPrice"
            },
            {
              "$ref": "#/domains/BicycleInsurance/types/PaymentMethodTotal"
            }
          ]
        },
        "PaymentMethodPrice": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "annually",
                "monthly"
              ]
            },
            "method": {
              "type": "string",
              "enum": [
                "direct-debit",
                "credit-card",
                "mixed"
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type",
            "method",
            "price"
          ],
          "additionalProperties": false
        },
        "PaymentMethodTotal": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "annually",
                "monthly"
              ]
            },
            "method": {
              "type": "string",
              "enum": [
                "direct-debit",
                "credit-card",
                "mixed"
              ]
            },
            "monthly": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "total": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type",
            "method",
            "monthly",
            "total"
          ],
          "additionalProperties": false
        },
        "QuoteValue": {
          "type": "object",
          "properties": {
            "monthly": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "annually": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about the successful operation."
            }
          },
          "required": [
            "message"
          ],
          "additionalProperties": false
        },
        "OptionalExtras": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": true
        },
        "AvailableAddresses": {
          "type": "array",
          "description": "An array of Addresses.",
          "items": {
            "$ref": "#/domains/BicycleInsurance/types/Address"
          },
          "minItems": 1
        },
        "Address": {
          "type": "string"
        },
        "AvailablePackages": {
          "type": "array",
          "description": "An array of Package objects.",
          "items": {
            "$ref": "#/domains/BicycleInsurance/types/Package"
          },
          "minItems": 1
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "type": "string",
              "minLength": 1
            },
            "monthly": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "annually": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "benefits": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": true
        },
        "Documents": {
          "type": "array",
          "description": "An array of Link objects.",
          "items": {
            "$ref": "#/domains/Generic/types/Link"
          },
          "minItems": 1
        },
        "AvailableOptions": {
          "type": "array",
          "description": "Additional options to be filled in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/BicycleInsurance/types/AvailableOptionString"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/AvailableOptionBoolean"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/AvailableOptionSelectOne"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/AvailableOptionSelectMany"
              }
            ]
          }
        },
        "AvailableOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Boolean"
              ]
            },
            "label": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "SelectedOptions": {
          "type": "array",
          "description": "Additional options to fill in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/BicycleInsurance/types/SelectedOptionString"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/SelectedOptionBoolean"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/SelectedOptionSelectOne"
              },
              {
                "$ref": "#/domains/BicycleInsurance/types/SelectedOptionSelectMany"
              }
            ]
          }
        },
        "SelectedOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "text": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "text"
          ],
          "additionalProperties": false
        },
        "SelectedOptionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "CoverStartDate": {
          "type": "string",
          "format": "date",
          "description": "The date the cover starts on.",
          "example": "1980-01-01"
        }
      },
      "errors": [
        {
          "code": "AccountDetailsInvalid",
          "category": "client",
          "description": "The account details are invalid"
        },
        {
          "code": "BicycleDetailsInvalid",
          "category": "client",
          "description": "The bicycle details are invalid"
        },
        {
          "code": "DirectDebitDetailsInvalid",
          "category": "client",
          "description": "The direct debit details are invalid"
        },
        {
          "code": "ApplicantDetailsInvalid",
          "category": "client",
          "description": "The applicant's details are invalid"
        },
        {
          "code": "QuoteNotAvailableOnline",
          "category": "website",
          "description": "The requested quote is not available online"
        }
      ]
    },
    "BookingTRV": {
      "description": "Automating hotel booking.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Url of Forwarder which will be redirected to advertisers landing page."
        },
        "guest_first_name": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_last_name": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_email": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_phone_number": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_street": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_house_number": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_city": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "guest_zip": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "card_pan_token": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "card_expiration_date": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "card_cvv": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "card_bank_name": {
          "typeRef": "#/domains/BookingTRV/types/String"
        }
      },
      "outputs": {
        "advertiser_lp_price": {
          "typeRef": "#/domains/Generic/types/Price"
        },
        "booking_price_net": {
          "typeRef": "#/domains/Generic/types/Price"
        },
        "booking_price_tax": {
          "typeRef": "#/domains/Generic/types/Price"
        },
        "booking_price_gross": {
          "typeRef": "#/domains/Generic/types/Price"
        },
        "trv_reference": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "booking_id": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "booking_timestamp": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "clickout_timestamp": {
          "typeRef": "#/domains/BookingTRV/types/String"
        },
        "booking_url": {
          "typeRef": "#/domains/BookingTRV/types/String"
        }
      },
      "types": {
        "String": {
          "type": "string"
        }
      },
      "errors": [
        {
          "code": "JobInputError",
          "category": "client",
          "description": "Script inputs are faulty"
        },
        {
          "code": "JobPaymentError",
          "category": "client",
          "description": "Payment failed"
        },
        {
          "code": "JobPageError",
          "category": "client",
          "description": "An Error occurred on the crawled page"
        },
        {
          "code": "ContextLimitError",
          "category": "client",
          "description": "No Context with non reached visit limit matches"
        },
        {
          "code": "JobBotDetectionError",
          "category": "client",
          "description": "The automation was detected as a bot"
        }
      ]
    },
    "BroadbandSignup": {
      "description": "Allows automating broadband package signups in the UK.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/BroadbandSignup/types/Options",
          "default": {},
          "initial": true
        },
        "landlineCheck": {
          "typeRef": "#/domains/BroadbandSignup/types/LandlineCheck",
          "canonical": [
            "/postcode"
          ]
        },
        "property": {
          "typeRef": "#/domains/BroadbandSignup/types/Property",
          "canonical": [
            "/address/postcode",
            "/address/city",
            "/address/countrySubdivision"
          ]
        },
        "selectedTvPackages": {
          "typeRef": "#/domains/BroadbandSignup/types/SelectedPackages",
          "sourceOutputKey": "availableTvPackages",
          "inputMethod": "SelectMany"
        },
        "selectedBroadbandPackage": {
          "typeRef": "#/domains/BroadbandSignup/types/SelectedPackage",
          "sourceOutputKey": "availableBroadbandPackages",
          "inputMethod": "SelectOne"
        },
        "selectedPhonePackage": {
          "typeRef": "#/domains/BroadbandSignup/types/SelectedPackage",
          "sourceOutputKey": "availablePhonePackages",
          "inputMethod": "SelectOne"
        },
        "contactPerson": {
          "typeRef": "#/domains/BroadbandSignup/types/PersonDob"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "directDebit": {
          "typeRef": "#/domains/BroadbandSignup/types/DirectDebit"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "landlineOptions": {
          "typeRef": "#/domains/BroadbandSignup/types/LandlineOptions"
        },
        "installation": {
          "typeRef": "#/domains/BroadbandSignup/types/Installation"
        },
        "monthlyPaymentMethod": {
          "typeRef": "#/domains/BroadbandSignup/types/PaymentMethod"
        },
        "selectedMarketingContactOptions": {
          "typeRef": "#/domains/BroadbandSignup/types/SelectedItem",
          "description": "List of marketing contact options to be selected.",
          "sourceOutputKey": "availableMarketingContactOptions",
          "inputMethod": "SelectMany"
        },
        "selectedTvSetupDate": {
          "typeRef": "#/domains/BroadbandSignup/types/SetupDate",
          "sourceOutputKey": "availableTvSetupDates",
          "inputMethod": "SelectOne"
        },
        "selectedBroadbandSetupDate": {
          "typeRef": "#/domains/BroadbandSignup/types/SetupDate",
          "sourceOutputKey": "availableBroadbandSetupDates",
          "inputMethod": "SelectOne"
        },
        "selectedMoveInDate": {
          "typeRef": "#/domains/BroadbandSignup/types/SetupDate",
          "sourceOutputKey": "availableMoveInDates",
          "inputMethod": "SelectOne"
        },
        "selectedActiveLandlineOption": {
          "typeRef": "#/domains/BroadbandSignup/types/String",
          "sourceOutputKey": "availableActiveLandlineOptions",
          "inputMethod": "SelectOne"
        },
        "selectedAddress": {
          "typeRef": "#/domains/BroadbandSignup/types/PIIString",
          "sourceOutputKey": "availableAddresses",
          "inputMethod": "SelectOne"
        },
        "selectedInstallationAddress": {
          "typeRef": "#/domains/BroadbandSignup/types/PIIString",
          "sourceOutputKey": "availableInstallationAddresses",
          "inputMethod": "SelectOne"
        },
        "selectedLineInstallationOption": {
          "typeRef": "#/domains/BroadbandSignup/types/String"
        },
        "landlineChallenge": {
          "typeRef": "#/domains/BroadbandSignup/types/String"
        },
        "directoryListing": {
          "typeRef": "#/domains/BroadbandSignup/types/Boolean"
        },
        "alternativeCorrespondence": {
          "typeRef": "#/domains/BroadbandSignup/types/NullableProperty"
        },
        "existingLandline": {
          "typeRef": "#/domains/BroadbandSignup/types/ExistingLandline"
        },
        "voucherCode": {
          "typeRef": "#/domains/BroadbandSignup/types/Voucher"
        }
      },
      "outputs": {
        "availableMarketingContactOptions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems",
          "description": "List of marketing contact options provided by the insurer."
        },
        "availableTvPackages": {
          "typeRef": "#/domains/BroadbandSignup/types/Packages"
        },
        "availableBroadbandPackages": {
          "typeRef": "#/domains/BroadbandSignup/types/Packages"
        },
        "availablePhonePackages": {
          "typeRef": "#/domains/BroadbandSignup/types/Packages"
        },
        "installationOptions": {
          "typeRef": "#/domains/BroadbandSignup/types/InstallationOptions"
        },
        "availableAddresses": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableAddresses"
        },
        "availableInstallationAddresses": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableAddresses"
        },
        "availableTvSetupDates": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableSetupDatesOrNull"
        },
        "availableBroadbandSetupDates": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableSetupDatesOrNull"
        },
        "availableMoveInDates": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableSetupDatesOrNull"
        },
        "availableLineInstallationOptions": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableLineInstallationOptions"
        },
        "estimatedPriceBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems"
        },
        "monthlyCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "oneOffCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "equipmentCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "extrasCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "upfrontPayment": {
          "typeRef": "#/domains/BroadbandSignup/types/Anything"
        },
        "totalOneOffPrice": {
          "typeRef": "#/domains/BroadbandSignup/types/Anything"
        },
        "monthlyPayments": {
          "typeRef": "#/domains/BroadbandSignup/types/Anything"
        },
        "estimatedSpeed": {
          "typeRef": "#/domains/BroadbandSignup/types/Anything"
        },
        "confirmation": {
          "typeRef": "#/domains/BroadbandSignup/types/Confirmation"
        },
        "setupRequired": {
          "typeRef": "#/domains/BroadbandSignup/types/Boolean"
        },
        "availableActiveLandlineOptions": {
          "typeRef": "#/domains/BroadbandSignup/types/AvailableActiveLandlineOptions"
        },
        "serviceTermsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when T&Cs are presented."
        },
        "selectionBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems"
        },
        "voucherDetails": {
          "typeRef": "#/domains/BroadbandSignup/types/VoucherInformation"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "marketingContact": {
              "type": "boolean",
              "default": false
            },
            "success": {
              "type": "boolean",
              "default": false
            },
            "directoryListing": {
              "type": "boolean",
              "default": false
            },
            "addressSelection": {
              "type": "boolean",
              "default": false
            },
            "moveInDateSelection": {
              "type": "boolean",
              "default": false
            },
            "keepLandlineNumber": {
              "type": "boolean",
              "default": false
            },
            "screenshots": {
              "type": "boolean",
              "default": false
            },
            "testingFlow": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "LandlineCheck": {
          "type": "object",
          "description": "Information required to check existing landlines",
          "pii": true,
          "properties": {
            "postcode": {
              "$ref": "#/domains/BroadbandSignup/types/Postcode"
            },
            "landline": {
              "type": "string",
              "minLength": 9,
              "description": "Landline number (numbers only, excluding country code).",
              "example": "123456789",
              "pattern": "^0[0-9]{8,10}"
            },
            "billpayer": {
              "type": "boolean",
              "description": "Whether the user is also the bill payer of the landline check phone number."
            }
          },
          "required": [
            "postcode"
          ],
          "additionalProperties": false
        },
        "NullableProperty": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignup/types/Property"
            },
            {
              "type": "null"
            }
          ]
        },
        "Property": {
          "type": "object",
          "description": "Information about the property to be serviced.",
          "pii": true,
          "properties": {
            "address": {
              "type": "object",
              "properties": {
                "houseName": {
                  "type": "string",
                  "example": "Da house"
                },
                "streetNumber": {
                  "type": "string",
                  "minLength": 1,
                  "example": "93"
                },
                "streetName": {
                  "type": "string",
                  "minLength": 1,
                  "example": "Clerkenwell Close"
                },
                "postcode": {
                  "$ref": "#/domains/BroadbandSignup/types/Postcode"
                },
                "city": {
                  "type": "string",
                  "minLength": 1,
                  "example": "Dagenham"
                },
                "countrySubdivision": {
                  "type": "string",
                  "example": "Greater London"
                }
              },
              "required": [
                "postcode",
                "city",
                "countrySubdivision"
              ]
            }
          },
          "required": [
            "address"
          ],
          "additionalProperties": false
        },
        "LandlineOptions": {
          "type": "object",
          "description": "Owner details in relation to the address.",
          "pii": true,
          "properties": {
            "justMoved": {
              "type": "boolean"
            },
            "sharedProperty": {
              "type": "boolean"
            },
            "restartLine": {
              "type": "boolean"
            },
            "landline": {
              "type": "string",
              "minLength": 9,
              "description": "Landline number (numbers only, excluding country code).",
              "example": "123456789",
              "pattern": "^0[0-9]{8,10}"
            },
            "additionalLine": {
              "type": "boolean"
            }
          },
          "required": [
            "justMoved",
            "sharedProperty",
            "restartLine"
          ],
          "additionalProperties": false
        },
        "InstallationOptions": {
          "type": "object",
          "pii": true,
          "properties": {
            "propertyTypes": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string"
              }
            },
            "accessRestrictions": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string"
              }
            },
            "parkingRestrictions": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string"
              }
            },
            "buildingTypes": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string"
              }
            },
            "storeySelection": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "string"
              }
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Installation": {
          "type": "object",
          "pii": true,
          "properties": {
            "propertyType": {
              "type": "string"
            },
            "accessRestrictions": {
              "type": "string"
            },
            "parkingRestrictions": {
              "type": "string"
            },
            "buildingType": {
              "type": "string"
            },
            "storeySelection": {
              "type": "string"
            },
            "hasAccessToCommunalSatellite": {
              "type": "boolean"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "SelectedPackages": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignup/types/Packages"
            },
            {
              "type": "null"
            }
          ]
        },
        "SelectedPackage": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignup/types/Package"
            },
            {
              "type": "null"
            }
          ]
        },
        "Packages": {
          "type": "array",
          "description": "A list of packages.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignup/types/Package"
          }
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "All in One Package",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "image": {
              "$ref": "#/domains/Generic/types/Link"
            },
            "estimatedSpeed": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "PersonDob": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "Voucher": {
          "type": "object",
          "description": "Voucher details required to claim rewards.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "format": "email",
              "description": "Email used to receive information about voucher details.",
              "example": "hello@example.com"
            }
          },
          "required": [
            "email"
          ],
          "additionalProperties": false
        },
        "VoucherInformation": {
          "type": "object",
          "properties": {
            "termsAndConditions": {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            }
          },
          "additionalProperties": false
        },
        "DirectDebit": {
          "description": "Direct debit information for GB (sort code and account number) or IBAN information.",
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignup/types/DirectDebitGB"
            },
            {
              "$ref": "#/domains/BroadbandSignup/types/DirectDebitIban"
            }
          ]
        },
        "DirectDebitGB": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "sortCode": {
              "type": "string",
              "description": "Bank sort code",
              "pattern": "\\d{2}-?\\d{2}-?\\d{2}",
              "example": "56-00-29"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 8,
              "maxLength": 8,
              "description": "Account number provided by the bank.",
              "example": "26207729"
            },
            "accountHolder": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "accountHolderAddress": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "sortCode",
            "accountNumber",
            "accountHolder",
            "accountHolderAddress"
          ],
          "additionalProperties": false
        },
        "DirectDebitIban": {
          "type": "object",
          "description": "Account details for direct debit using IBAN.",
          "pii": true,
          "properties": {
            "iban": {
              "type": "string",
              "description": "International bank account number.",
              "example": "NL99BANK0123456789"
            }
          },
          "required": [
            "iban"
          ],
          "additionalProperties": false
        },
        "SetupDate": {
          "type": "object",
          "description": "Account details for direct debit.",
          "properties": {
            "date": {
              "type": "string",
              "format": "date",
              "example": "2019-01-01"
            }
          },
          "required": [
            "date"
          ],
          "additionalProperties": false
        },
        "AvailableSetupDatesOrNull": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "array",
              "description": "A list of setup dates.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/BroadbandSignup/types/SetupDate"
              }
            }
          ]
        },
        "Postcode": {
          "type": "string",
          "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
          "minLength": 4,
          "example": "RM108DE"
        },
        "AvailableAddresses": {
          "type": "array",
          "description": "A list of addresses.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "AvailableLineInstallationOptions": {
          "type": "array",
          "description": "A list of addresses.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "PaymentMethod": {
          "type": "string",
          "enum": [
            "card",
            "directdebit"
          ]
        },
        "Boolean": {
          "type": "boolean",
          "enum": [
            true,
            false
          ]
        },
        "SelectedItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            },
            {
              "type": "null"
            }
          ]
        },
        "AvailableActiveLandlineOptions": {
          "type": "array",
          "description": "A list of options.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "ExistingLandline": {
          "oneOf": [
            {
              "type": "object",
              "description": "Information required to check existing landlines",
              "pii": true,
              "properties": {
                "postcode": {
                  "$ref": "#/domains/BroadbandSignup/types/Postcode"
                },
                "landline": {
                  "type": "string",
                  "minLength": 9,
                  "description": "Landline number (numbers only, excluding country code).",
                  "example": "123456789",
                  "pattern": "^0[0-9]{8,10}"
                },
                "provider": {
                  "type": "string",
                  "description": "Landline provider"
                }
              },
              "required": [
                "postcode",
                "landline",
                "provider"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "PIIString": {
          "type": "string",
          "pii": true
        },
        "String": {
          "type": "string"
        },
        "Anything": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array"
            },
            {
              "type": "object"
            }
          ]
        }
      },
      "errors": [
        {
          "code": "ContactUsToContinue",
          "category": "client",
          "description": "The user being asked to contact the supplier to continue the purchase."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The user being signed up is already a customer of this service."
        },
        {
          "code": "PackageNotAvailable",
          "category": "client",
          "description": "The package is not avaialbe."
        },
        {
          "code": "BankDetailsInvalid",
          "category": "client",
          "description": "Bank details invalid."
        },
        {
          "code": "DirectDebitRejected",
          "category": "client",
          "description": "Direct debit details rejected."
        },
        {
          "code": "LandlineMandatory",
          "category": "client",
          "description": "The landline is mandatory, but not either not provided or not valid."
        },
        {
          "code": "LandlineInvalid",
          "category": "client",
          "description": "The landline is not valid."
        },
        {
          "code": "OfferNotAvailable",
          "category": "client",
          "description": "The offer is not available, usually expired or not applicable to the user or client."
        }
      ]
    },
    "BroadbandSignupAU": {
      "description": "Allows automating broadband package signups in Australia.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Options",
          "default": {},
          "initial": true
        },
        "searchAddress": {
          "typeRef": "#/domains/BroadbandSignupAU/types/StringAddress"
        },
        "selectedAddress": {
          "typeRef": "#/domains/BroadbandSignupAU/types/StringAddress",
          "sourceOutputKey": "availableAddresses",
          "inputMethod": "SelectOne"
        },
        "selectedBroadbandPackage": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Package",
          "sourceOutputKey": "availableBroadbandPackages",
          "inputMethod": "SelectOne"
        },
        "selectedBroadbandExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras",
          "sourceOutputKey": "availableBroadbandExtras",
          "inputMethod": "SelectMany"
        },
        "selectedPhoneExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras",
          "sourceOutputKey": "availablePhoneExtras",
          "inputMethod": "SelectMany"
        },
        "selectedTvExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras",
          "sourceOutputKey": "availableTvExtras",
          "inputMethod": "SelectMany"
        },
        "selectedTvPackage": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extra",
          "sourceOutputKey": "availableTvPackages",
          "inputMethod": "SelectOne"
        },
        "contactPerson": {
          "typeRef": "#/domains/BroadbandSignupAU/types/PersonDob"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "identityDocument": {
          "typeRef": "#/domains/BroadbandSignupAU/types/IdentityDocument"
        },
        "currentAddress": {
          "typeRef": "#/domains/BroadbandSignupAU/types/CurrentAddress"
        },
        "previousAddresses": {
          "typeRef": "#/domains/BroadbandSignupAU/types/PreviousAddresses",
          "inputMethod": "SelectMany"
        },
        "employment": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Employment"
        },
        "landlineOptions": {
          "typeRef": "#/domains/BroadbandSignupAU/types/LandlineOptions"
        },
        "keepPhoneNumberDetails": {
          "typeRef": "#/domains/BroadbandSignupAU/types/KeepPhoneNumberDetails"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        }
      },
      "outputs": {
        "availableAddresses": {
          "typeRef": "#/domains/BroadbandSignupAU/types/StringAddresses",
          "description": "List of available addresses to select from."
        },
        "availableBroadbandPackages": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Packages"
        },
        "availableBroadbandExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras"
        },
        "availablePhoneExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras"
        },
        "availableTvExtras": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras"
        },
        "availableTvPackages": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Extras"
        },
        "priceBreakdown": {
          "typeRef": "#/domains/BroadbandSignupAU/types/PriceBreakdown",
          "description": "The list of price components, as found on the website."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "confirmation": {
          "typeRef": "#/domains/BroadbandSignupAU/types/Confirmation",
          "description": "Booking confirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [
            "success"
          ],
          "additionalProperties": false
        },
        "StringAddress": {
          "type": "string",
          "example": "50 Cresthaven"
        },
        "StringAddresses": {
          "type": "array",
          "description": "A list of strings.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupAU/types/StringAddress"
          }
        },
        "Packages": {
          "type": "array",
          "description": "A list of packages.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupAU/types/Package"
          }
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "All in One Package",
              "minLength": 1
            },
            "paymentPlanName": {
              "type": "string",
              "example": "Month to month",
              "minLength": 1
            },
            "priceLine": {
              "type": "string",
              "example": "Min. total cost for first month is $270 incl. $200 upfront costs",
              "minLength": 1
            },
            "description": {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "image": {
              "$ref": "#/domains/Generic/types/Link"
            },
            "estimatedSpeed": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Extras": {
          "type": "array",
          "description": "A list of extras.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupAU/types/Extra"
          }
        },
        "Extra": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "Internet 100",
              "minLength": 1
            },
            "description": {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "CurrentAddress": {
          "type": "object",
          "properties": {
            "line1": {
              "type": "string",
              "example": "50 CRESTHAVEN BVD",
              "minLength": 1
            },
            "line2": {
              "type": "string",
              "example": "Flat 2"
            },
            "postCode": {
              "type": "string",
              "example": "3806",
              "minLength": 1
            },
            "city": {
              "type": "string",
              "example": "Melbourne",
              "minLength": 1
            },
            "citySubdivision": {
              "type": "string",
              "example": "Berwick",
              "minLength": 1
            },
            "countrySubdivision": {
              "$ref": "#/domains/BroadbandSignupAU/types/StateCode"
            },
            "status": {
              "type": "string",
              "enum": [
                "owned",
                "rent",
                "others"
              ]
            },
            "moveInDate": {
              "type": "string",
              "format": "date",
              "example": "2001-01-01"
            }
          },
          "required": [
            "line1",
            "postCode",
            "city",
            "citySubdivision",
            "countrySubdivision",
            "status"
          ],
          "additionalProperties": false
        },
        "PreviousAddresses": {
          "type": "array",
          "description": "A list of extras.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupAU/types/PreviousAddress"
          }
        },
        "PreviousAddress": {
          "type": "object",
          "properties": {
            "line1": {
              "type": "string",
              "example": "50 CRESTHAVEN BVD",
              "minLength": 1
            },
            "line2": {
              "type": "string",
              "example": "Flat 2"
            },
            "postCode": {
              "type": "string",
              "example": "3806",
              "minLength": 1
            },
            "city": {
              "type": "string",
              "example": "Melbourne",
              "minLength": 1
            },
            "citySubdivision": {
              "type": "string",
              "example": "Berwick",
              "minLength": 1
            },
            "countrySubdivision": {
              "$ref": "#/domains/BroadbandSignupAU/types/StateCode"
            }
          },
          "required": [
            "line1",
            "postCode",
            "city",
            "citySubdivision",
            "countrySubdivision"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "properties": {
            "occupation": {
              "type": "string",
              "example": "Product Manager",
              "minLength": 1
            },
            "industry": {
              "type": "string",
              "example": "IT",
              "minLength": 1
            },
            "status": {
              "type": "string",
              "enum": [
                "self-employed",
                "employed",
                "unemployed",
                "part-time",
                "retired"
              ]
            },
            "employerName": {
              "type": "string",
              "example": "Intel",
              "minLength": 1
            },
            "startDate": {
              "type": "string",
              "format": "date",
              "example": "2001-01-01"
            }
          },
          "required": [
            "occupation",
            "industry",
            "status",
            "employerName",
            "startDate"
          ],
          "additionalProperties": false
        },
        "PersonDob": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "driving-license"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueState": {
              "$ref": "#/domains/BroadbandSignupAU/types/StateCode"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number",
            "expirationDate",
            "issueCountryCode",
            "issueState"
          ],
          "additionalProperties": false
        },
        "LandlineOptions": {
          "type": "object",
          "description": "Landline options.",
          "properties": {
            "keepPhoneNumber": {
              "type": "boolean"
            },
            "transferService": {
              "type": "boolean"
            }
          },
          "required": [
            "keepPhoneNumber",
            "transferService"
          ],
          "additionalProperties": false
        },
        "KeepPhoneNumberDetails": {
          "type": "object",
          "description": "Landline options.",
          "properties": {
            "phoneNumber": {
              "type": "string",
              "minLength": 10,
              "description": "Landline number (numbers only, excluding country code).",
              "example": "123456789",
              "pattern": "^0[0-9]{8,10}"
            },
            "serviceProvider": {
              "type": "string",
              "example": "dodo"
            },
            "accountNumber": {
              "type": "string",
              "example": "1234567890"
            }
          },
          "required": [
            "phoneNumber",
            "serviceProvider",
            "accountNumber"
          ],
          "additionalProperties": false
        },
        "PriceBreakdown": {
          "type": "array",
          "description": "The list of price components, as found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupAU/types/PriceBreakdownItem"
          }
        },
        "PriceBreakdownItem": {
          "type": "object",
          "description": "A component of the price breakdown.",
          "properties": {
            "text": {
              "type": "string",
              "description": "The description of an item on the price breakdown list, as found on the website.",
              "example": "Credit card charge"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "text",
            "price"
          ]
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference extracted from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "StateCode": {
          "type": "string",
          "title": "ISO state code.",
          "description": "ISO state code representing the state. Uppercase.",
          "example": "us",
          "minLength": 2,
          "maxLength": 3,
          "enum": [
            "ACT",
            "NSW",
            "NT",
            "QLD",
            "SA",
            "TAS",
            "VIC",
            "WA"
          ]
        }
      },
      "errors": [
        {
          "code": "ContactUsToContinue",
          "category": "client",
          "description": "The user being asked to contact the supplier to continue the purchase."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The user being signed up is already a customer of this service."
        },
        {
          "code": "PackageNotAvailable",
          "category": "client",
          "description": "The package is not avaialbe."
        },
        {
          "code": "LandlineMandatory",
          "category": "client",
          "description": "The landline is mandatory, but not either not provided or not valid."
        },
        {
          "code": "LandlineInvalid",
          "category": "client",
          "description": "The landline is not valid."
        }
      ]
    },
    "BroadbandSignupUS": {
      "description": "Allows automating broadband package signups in the US.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Options",
          "default": {},
          "initial": true
        },
        "serviceAddress": {
          "typeRef": "#/domains/BroadbandSignupUS/types/ServiceAddress",
          "canonical": [
            "/zip",
            "/streetAddress"
          ]
        },
        "contactPerson": {
          "typeRef": "#/domains/BroadbandSignupUS/types/PersonDob"
        },
        "addBroadband": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Internet"
        },
        "selectedTvPackages": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SelectedPackages",
          "sourceOutputKey": "availableTvPackages",
          "inputMethod": "SelectMany"
        },
        "selectedTvPromotions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull",
          "sourceOutputKey": "availableTvPromotions",
          "inputMethod": "SelectMany"
        },
        "selectedPremiumTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull",
          "sourceOutputKey": "availablePremiumTvChannels",
          "inputMethod": "SelectMany"
        },
        "selectedInternationalTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull",
          "sourceOutputKey": "availableInternationalTvChannels",
          "inputMethod": "SelectMany"
        },
        "selectedSportsTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull",
          "sourceOutputKey": "availableSportsTvChannels",
          "inputMethod": "SelectMany"
        },
        "selectedHardwareExtras": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SelectedHardwareExtras",
          "sourceOutputKey": "availableHardwareExtras",
          "inputMethod": "SelectMany"
        },
        "selectedHardwareOption": {
          "typeRef": "#/domains/BroadbandSignupUS/types/HardwareOption",
          "sourceOutputKey": "availableHardwareOptions",
          "inputMethod": "SelectOne"
        },
        "selectedLandlordPermissionAnswer": {
          "typeRef": "#/domains/BroadbandSignupUS/types/LandlordPermissionAnswer",
          "sourceOutputKey": "availableLandlordPermissionAnswers",
          "inputMethod": "SelectOne"
        },
        "selectedBroadbandExtras": {
          "typeRef": "#/domains/BroadbandSignupUS/types/BroadbandExtras",
          "sourceOutputKey": "availableBroadbandExtras",
          "inputMethod": "SelectMany"
        },
        "selectedBroadbandPackage": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SelectedPackage",
          "sourceOutputKey": "availableBroadbandPackages",
          "inputMethod": "SelectOne"
        },
        "selectedInstallationOption": {
          "typeRef": "#/domains/BroadbandSignupUS/types/InstallationOption",
          "sourceOutputKey": "availableInstallationOptions",
          "inputMethod": "SelectOne"
        },
        "selectedPhonePackage": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SelectedPackage",
          "sourceOutputKey": "availablePhonePackages",
          "inputMethod": "SelectOne"
        },
        "agentAccount": {
          "typeRef": "#/domains/BroadbandSignupUS/types/AgentAccount"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "payment": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "recurringPayment": {
          "typeRef": "#/domains/BroadbandSignupUS/types/RecurringPayment"
        },
        "recurringPanToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "landlineOptions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/LandlineOptions"
        },
        "creditCheck": {
          "typeRef": "#/domains/BroadbandSignupUS/types/CreditCheckOrNull"
        },
        "creditCheckAddress": {
          "typeRef": "#/domains/BroadbandSignupUS/types/CheckAddressOrNull"
        },
        "tvCount": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvCount"
        },
        "directDebit": {
          "typeRef": "#/domains/BroadbandSignupUS/types/DirectDebitIban"
        },
        "selectedTvSetupDate": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SetupDate",
          "sourceOutputKey": "availableTvSetupDates",
          "inputMethod": "SelectOne"
        },
        "selectedBroadbandSetupDate": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SetupDate",
          "sourceOutputKey": "availableBroadbandSetupDates",
          "inputMethod": "SelectOne"
        },
        "selectedActiveLandlineOption": {
          "typeRef": "#/domains/BroadbandSignupUS/types/String",
          "sourceOutputKey": "availableActiveLandlineOptions",
          "inputMethod": "SelectOne"
        },
        "selectedSecurityQuestion": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SecurityQuestion",
          "sourceOutputKey": "availableSecurityQuestions",
          "inputMethod": "SelectOne"
        },
        "accountSecurityCode": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SecurityCode"
        },
        "securityAnswer": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Answer"
        },
        "existingLandline": {
          "typeRef": "#/domains/BroadbandSignupUS/types/ExistingLandline"
        }
      },
      "outputs": {
        "availableTvPackages": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Packages"
        },
        "availableTvPromotions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull"
        },
        "availablePremiumTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull"
        },
        "availableInternationalTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull"
        },
        "availableSportsTvChannels": {
          "typeRef": "#/domains/BroadbandSignupUS/types/TvOptionsOrNull"
        },
        "availableBroadbandPackages": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Packages"
        },
        "availableBroadbandExtras": {
          "typeRef": "#/domains/BroadbandSignupUS/types/BroadbandExtras"
        },
        "availableHardwareExtras": {
          "typeRef": "#/domains/BroadbandSignupUS/types/HardwareExtras"
        },
        "availableHardwareOptions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/HardwareOptions"
        },
        "availableLandlordPermissionAnswers": {
          "typeRef": "#/domains/BroadbandSignupUS/types/LandlordPermissionAnswers"
        },
        "availablePhonePackages": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Packages"
        },
        "availableInstallationOptions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/InstallationOptions"
        },
        "availableSecurityQuestions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/SecurityQuestions"
        },
        "availableTvSetupDates": {
          "typeRef": "#/domains/BroadbandSignupUS/types/AvailableSetupDatesOrNull"
        },
        "availableBroadbandSetupDates": {
          "typeRef": "#/domains/BroadbandSignupUS/types/AvailableSetupDatesOrNull"
        },
        "availableActiveLandlineOptions": {
          "typeRef": "#/domains/BroadbandSignupUS/types/AvailableActiveLandlineOptions"
        },
        "creditCheckServiceFee": {
          "typeRef": "#/domains/BroadbandSignupUS/types/CheckServiceFeeOrNull"
        },
        "estimatedPriceBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems"
        },
        "monthlyCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "oneOffCosts": {
          "typeRef": "#/domains/Generic/types/StructuredText"
        },
        "confirmation": {
          "typeRef": "#/domains/BroadbandSignupUS/types/Confirmation"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        }
      },
      "types": {
        "ServiceAddress": {
          "type": "object",
          "pii": true,
          "properties": {
            "streetAddress": {
              "type": "string",
              "default": ""
            },
            "unit": {
              "type": "string",
              "default": ""
            },
            "city": {
              "type": "string",
              "default": ""
            },
            "state": {
              "type": "string",
              "enum": [
                "AK",
                "AL",
                "AR",
                "AZ",
                "CA",
                "CO",
                "CT",
                "DC",
                "DE",
                "FL",
                "GA",
                "HI",
                "IA",
                "ID",
                "IL",
                "IN",
                "KS",
                "KY",
                "LA",
                "MA",
                "MD",
                "ME",
                "MI",
                "MN",
                "MO",
                "MS",
                "MT",
                "NC",
                "ND",
                "NE",
                "NH",
                "NJ",
                "NM",
                "NV",
                "NY",
                "OH",
                "OK",
                "OR",
                "PA",
                "RI",
                "SC",
                "SD",
                "TN",
                "TX",
                "UT",
                "VA",
                "VT",
                "WA",
                "WI",
                "WV",
                "WY"
              ]
            },
            "zip": {
              "type": "string",
              "default": ""
            }
          },
          "required": [
            "streetAddress",
            "zip"
          ],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            },
            "proxyUrl": {
              "type": "string",
              "default": ""
            },
            "mockDatabaseUrl": {
              "type": "string",
              "default": ""
            },
            "checkoutType": {
              "type": "string",
              "enum": [
                "broadband-and-tv",
                "tv-and-broadband"
              ]
            }
          },
          "required": [
            "checkoutType"
          ],
          "additionalProperties": false
        },
        "Internet": {
          "type": "boolean",
          "default": false
        },
        "CreditCheckOrNull": {
          "pii": true,
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "description": "Information for client credit validation.",
              "pii": true,
              "properties": {
                "socialSecurityNumber": {
                  "type": "string",
                  "minLength": 9,
                  "maxLength": 11,
                  "default": ""
                },
                "document": {
                  "type": "object",
                  "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
                  "pii": true,
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "Document type.",
                      "enum": [
                        "driver-license",
                        "state-issued-id",
                        "military-id",
                        "us-passport",
                        "foreign-government-id"
                      ]
                    },
                    "number": {
                      "type": "string",
                      "description": "Document number.",
                      "example": "75 127001"
                    },
                    "issueDate": {
                      "type": "string",
                      "format": "date",
                      "example": "2008-01-01"
                    },
                    "expirationDate": {
                      "type": "string",
                      "format": "date",
                      "example": "2028-01-01"
                    },
                    "issueCountryCode": {
                      "$ref": "#/domains/Generic/types/CountryCode",
                      "description": "Code of country where the document was issued."
                    },
                    "issueStateCode": {
                      "type": "string",
                      "description": "Code of state where the document was issued.",
                      "example": "AZ",
                      "enum": [
                        "AK",
                        "AL",
                        "AR",
                        "AZ",
                        "CA",
                        "CO",
                        "CT",
                        "DC",
                        "DE",
                        "FL",
                        "GA",
                        "HI",
                        "IA",
                        "ID",
                        "IL",
                        "IN",
                        "KS",
                        "KY",
                        "LA",
                        "MA",
                        "MD",
                        "ME",
                        "MI",
                        "MN",
                        "MO",
                        "MS",
                        "MT",
                        "NC",
                        "ND",
                        "NE",
                        "NH",
                        "NJ",
                        "NM",
                        "NV",
                        "NY",
                        "OH",
                        "OK",
                        "OR",
                        "PA",
                        "RI",
                        "SC",
                        "SD",
                        "TN",
                        "TX",
                        "UT",
                        "VA",
                        "VT",
                        "WA",
                        "WI",
                        "WV",
                        "WY"
                      ]
                    }
                  },
                  "required": [
                    "type",
                    "number",
                    "expirationDate",
                    "issueStateCode"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "socialSecurityNumber"
              ],
              "additionalProperties": false
            }
          ]
        },
        "CheckAddressOrNull": {
          "pii": true,
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "description": "For different billing address.",
              "pii": true,
              "properties": {
                "streetAddress": {
                  "type": "string",
                  "default": ""
                },
                "unit": {
                  "type": "string",
                  "default": ""
                },
                "city": {
                  "type": "string",
                  "default": ""
                },
                "state": {
                  "type": "string",
                  "enum": [
                    "AK",
                    "AL",
                    "AR",
                    "AZ",
                    "CA",
                    "CO",
                    "CT",
                    "DC",
                    "DE",
                    "FL",
                    "GA",
                    "HI",
                    "IA",
                    "ID",
                    "IL",
                    "IN",
                    "KS",
                    "KY",
                    "LA",
                    "MA",
                    "MD",
                    "ME",
                    "MI",
                    "MN",
                    "MO",
                    "MS",
                    "MT",
                    "NC",
                    "ND",
                    "NE",
                    "NH",
                    "NJ",
                    "NM",
                    "NV",
                    "NY",
                    "OH",
                    "OK",
                    "OR",
                    "PA",
                    "RI",
                    "SC",
                    "SD",
                    "TN",
                    "TX",
                    "UT",
                    "VA",
                    "VT",
                    "WA",
                    "WI",
                    "WV",
                    "WY"
                  ]
                },
                "zip": {
                  "type": "string",
                  "default": ""
                }
              },
              "required": [
                "streetAddress",
                "unit",
                "zip"
              ],
              "additionalProperties": false
            }
          ]
        },
        "CheckServiceFeeOrNull": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            }
          ]
        },
        "AgentAccount": {
          "type": "object",
          "description": "Information about the agent login account.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "format": "email",
              "example": "agent@example.com"
            },
            "userName": {
              "type": "string",
              "default": ""
            },
            "password": {
              "type": "string",
              "default": ""
            }
          },
          "required": [
            "password"
          ],
          "additionalProperties": false
        },
        "LandlineOptions": {
          "type": "object",
          "description": "Owner details in relation to the address.",
          "pii": true,
          "properties": {
            "justMoved": {
              "type": "boolean"
            },
            "sharedProperty": {
              "type": "boolean"
            },
            "restartLine": {
              "type": "boolean"
            },
            "landline": {
              "type": "string",
              "minLength": 9,
              "description": "Landline number (numbers only, excluding country code).",
              "example": "123456789",
              "pattern": "^0[0-9]{8,10}"
            },
            "additionalLine": {
              "type": "boolean"
            }
          },
          "required": [
            "justMoved",
            "sharedProperty",
            "restartLine"
          ],
          "additionalProperties": false
        },
        "TvCount": {
          "type": "integer",
          "minimum": 1,
          "description": "Number of TV's in the household.",
          "example": "8",
          "pattern": "^0[0-9]{1,2}"
        },
        "SecurityCode": {
          "type": "string",
          "minLength": 4,
          "maxLength": 4,
          "description": "For authentication purposes, customers are required to set up a 4-digit passcode (Pin).",
          "pii": true
        },
        "SelectedPackages": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignupUS/types/Packages"
            },
            {
              "type": "null"
            }
          ]
        },
        "SelectedPackage": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignupUS/types/Package"
            },
            {
              "type": "null"
            }
          ]
        },
        "Packages": {
          "type": "array",
          "description": "A list of packages.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/Package"
          }
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "All in One Package",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "image": {
              "$ref": "#/domains/Generic/types/Link"
            },
            "estimatedSpeed": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "BroadbandExtras": {
          "type": "array",
          "description": "A list of broadband extra options.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/BroadbandExtra"
          }
        },
        "BroadbandExtra": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "InstallationOptions": {
          "type": "array",
          "description": "A list of installation packages.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/InstallationOption"
          }
        },
        "InstallationOption": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "Professional Install",
              "minLength": 1
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "HardwareExtras": {
          "type": "array",
          "description": "A list of hardware devices.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/HardwareExtra"
          }
        },
        "HardwareExtra": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "Genie Mini",
              "minLength": 1
            },
            "maxCount": {
              "type": "integer",
              "example": "3",
              "minimum": 1,
              "description": "Maximum number of required devices.",
              "pattern": "^0[0-9]{1,2}"
            }
          },
          "required": [
            "name",
            "maxCount"
          ],
          "additionalProperties": false
        },
        "SelectedHardwareExtras": {
          "type": "array",
          "description": "A list of hardware devices.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/SelectedHardwareExtra"
          }
        },
        "SelectedHardwareExtra": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "Genie Mini",
              "minLength": 1
            },
            "count": {
              "type": "integer",
              "example": "3",
              "minimum": 1,
              "description": "Number of specific devices.",
              "pattern": "^0[0-9]{1}"
            }
          },
          "required": [
            "name",
            "count"
          ],
          "additionalProperties": false
        },
        "HardwareOptions": {
          "type": "array",
          "description": "A list of hardware options.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/HardwareOption"
          }
        },
        "HardwareOption": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "LandlordPermissionAnswers": {
          "type": "array",
          "description": "A list of answers for validating client permission to install services.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/LandlordPermissionAnswer"
          }
        },
        "LandlordPermissionAnswer": {
          "type": "string",
          "minLength": 1,
          "example": "I rent and I have permission from my landlord."
        },
        "TvOptionsOrNull": {
          "oneOf": [
            {
              "type": "array",
              "description": "A list of channels, promotions options.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/BroadbandSignupUS/types/TvOption"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "TvOption": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "PersonDob": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "DirectDebitIban": {
          "type": "object",
          "description": "Account details for direct debit using IBAN.",
          "pii": true,
          "properties": {
            "iban": {
              "type": "string",
              "description": "International bank account number.",
              "example": "NL99BANK0123456789"
            }
          },
          "required": [
            "iban"
          ],
          "additionalProperties": false
        },
        "SetupDate": {
          "type": "object",
          "description": "Account details for direct debit.",
          "properties": {
            "dateTime": {
              "type": "string",
              "minLength": 1,
              "example": "2020-03-16 09:00 - 11:00"
            }
          },
          "required": [
            "dateTime"
          ],
          "additionalProperties": false
        },
        "AvailableSetupDatesOrNull": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "array",
              "description": "A list of setup dates.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/BroadbandSignupUS/types/SetupDate"
              }
            }
          ]
        },
        "Postcode": {
          "type": "string",
          "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
          "minLength": 4,
          "example": "RM108DE"
        },
        "SecurityQuestions": {
          "type": "array",
          "description": "A list of security questions.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupUS/types/SecurityQuestion"
          }
        },
        "SecurityQuestion": {
          "type": "string",
          "pii": true,
          "description": "A question for authentication if credentials are forgotten.",
          "example": "Who is your favorite actor?"
        },
        "Answer": {
          "type": "string",
          "pii": true,
          "description": "A answer to selected security question for authentication if credentials are forgotten.",
          "example": "Van Damme"
        },
        "Boolean": {
          "type": "boolean",
          "enum": [
            true,
            false
          ]
        },
        "AvailableActiveLandlineOptions": {
          "type": "array",
          "description": "A list of options.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "ExistingLandline": {
          "oneOf": [
            {
              "type": "object",
              "description": "Information required to check existing landlines",
              "pii": true,
              "properties": {
                "postcode": {
                  "$ref": "#/domains/BroadbandSignupUS/types/Postcode"
                },
                "landline": {
                  "type": "string",
                  "minLength": 9,
                  "description": "Landline number (numbers only, excluding country code).",
                  "example": "123456789",
                  "pattern": "^0[0-9]{8,10}"
                },
                "provider": {
                  "type": "string",
                  "description": "Landline provider"
                }
              },
              "required": [
                "postcode",
                "landline",
                "provider"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "Payment": {
          "type": "object",
          "description": "Payment information",
          "pii": true,
          "properties": {
            "address": {
              "type": "object",
              "properties": {
                "postcode": {
                  "type": "string",
                  "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
                  "example": "94581"
                }
              },
              "required": [
                "postcode"
              ],
              "additionalProperties": false
            },
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            }
          },
          "required": [
            "address",
            "card"
          ],
          "additionalProperties": false
        },
        "RecurringPayment": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/domains/BroadbandSignupUS/types/Payment"
            }
          ]
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "PIIString": {
          "type": "string",
          "pii": true
        },
        "String": {
          "type": "string"
        }
      },
      "errors": [
        {
          "code": "InvalidSSN",
          "category": "client",
          "description": "The social security number is invalid."
        },
        {
          "code": "InvalidPIN",
          "category": "client",
          "description": "The PIN is invalid."
        },
        {
          "code": "PackageNotAvailable",
          "category": "client",
          "description": "The package is not available."
        },
        {
          "code": "OfferNotAvailable",
          "category": "client",
          "description": "The offer is not available, usually expired or not applicable to the user or client."
        },
        {
          "code": "DateOfBirthInvalid",
          "category": "client",
          "description": "Date of birth is not accepted by the website",
          "example": "Child must be younger than 12"
        },
        {
          "code": "DocumentIssueDateInvalid",
          "category": "client",
          "description": "Document issue date is not accepted by the website",
          "example": "The issue date cannot be after today's date"
        },
        {
          "code": "DocumentExpiryDateInvalid",
          "category": "client",
          "description": "Document expiration date is not accepted by the website",
          "example": "Document should be valid for more than 3 months"
        },
        {
          "code": "SecurityInformationInvalid",
          "category": "client",
          "description": "The security information provided was not accepted by the website.",
          "example": "Invalid security code or question."
        },
        {
          "code": "ContactDetailsInvalid",
          "category": "client",
          "description": "Invalid contact details."
        },
        {
          "code": "CreditCheckAddressInvalid",
          "category": "client",
          "description": "Invalid credit check address."
        }
      ]
    },
    "BroadbandSignupES": {
      "description": "Allows automating broadband package signups in the ES.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/BroadbandSignupES/types/Options",
          "default": {},
          "initial": true
        },
        "serviceAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/ServiceAddress",
          "canonical": [
            "/postcode",
            "/city"
          ]
        },
        "billingAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/ServiceAddress",
          "canonical": [
            "/postcode",
            "/city"
          ]
        },
        "selectedBroadbandPackage": {
          "typeRef": "#/domains/BroadbandSignupES/types/Package",
          "sourceOutputKey": "availableBroadbandPackages",
          "inputMethod": "SelectOne"
        },
        "contactPerson": {
          "typeRef": "#/domains/BroadbandSignupES/types/Person"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "iban": {
          "typeRef": "#/domains/BroadbandSignupES/types/String"
        },
        "bankAccountHolder": {
          "typeRef": "#/domains/BroadbandSignupES/types/Person"
        },
        "landlineOptions": {
          "typeRef": "#/domains/BroadbandSignupES/types/LandlineOptions"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/BroadbandSignupES/types/FinalPrice",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "selectedBroadbandSetupDate": {
          "typeRef": "#/domains/BroadbandSignupES/types/SetupDate",
          "sourceOutputKey": "availableBroadbandSetupDates",
          "inputMethod": "SelectOne"
        },
        "selectedMarketingContactOptions": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings",
          "description": "List of marketing contact options to be selected.",
          "sourceOutputKey": "availableMarketingContactOptions",
          "inputMethod": "SelectMany"
        },
        "selectedStreetNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableStreetNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedFloorNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableFloorNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedDoorNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableDoorNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBuildingNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBuildingNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedEntranceNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableEntranceNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBillingStreetNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBillingStreetNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBillingFloorNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBillingFloorNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBillingDoorNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBillingDoorNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBillingEntranceNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBillingEntranceNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedBillingBuildingNumber": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "sourceOutputKey": "availableBillingBuildingNumbers",
          "inputMethod": "SelectOne"
        },
        "selectedServiceAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "description": "Selected service addresses.",
          "sourceOutputKey": "availableServiceAddresses",
          "inputMethod": "SelectOne"
        },
        "selectedBillingAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "description": "Selected billing addresses.",
          "sourceOutputKey": "availableBillingAddresses",
          "inputMethod": "SelectOne"
        },
        "selectedServiceAddressComponent": {
          "typeRef": "#/domains/BroadbandSignupES/types/SelectedDynamicOption",
          "dynamic": true
        },
        "selectedBillingAddressComponent": {
          "typeRef": "#/domains/BroadbandSignupES/types/SelectedDynamicOption",
          "dynamic": true
        },
        "selectedServiceProvider": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "description": "Selected provider.",
          "sourceOutputKey": "availableServiceProviders",
          "inputMethod": "SelectOne"
        }
      },
      "outputs": {
        "availableBroadbandPackages": {
          "typeRef": "#/domains/BroadbandSignupES/types/Packages"
        },
        "updatedBroadbandPrice": {
          "typeRef": "#/domains/BroadbandSignupES/types/String"
        },
        "availableBroadbandSetupDates": {
          "typeRef": "#/domains/BroadbandSignupES/types/AvailableSetupDatesOrNull"
        },
        "legalConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem"
        },
        "privacyPolicy": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the privacy policy is presented."
        },
        "availableMarketingContactOptions": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings",
          "description": "List of marketing contact options provided by the provider."
        },
        "availableServiceAddresses": {
          "typeRef": "#/domains/BroadbandSignupES/types/ServiceAddresses",
          "description": "List of service addresses."
        },
        "availableBillingAddresses": {
          "typeRef": "#/domains/BroadbandSignupES/types/BillingAddresses",
          "description": "List of billing addresses."
        },
        "availableServiceProviders": {
          "typeRef": "#/domains/BroadbandSignupES/types/ServiceProviders",
          "description": "List of providers."
        },
        "availableNationalities": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableServiceAddressComponent": {
          "typeRef": "#/domains/BroadbandSignupES/types/AvailableDynamicOption",
          "dynamic": true
        },
        "availableBillingAddressComponent": {
          "typeRef": "#/domains/BroadbandSignupES/types/AvailableDynamicOption",
          "dynamic": true
        },
        "availableStreetNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableFloorNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableDoorNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableBuildingNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableEntranceNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "finalServiceAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/String"
        },
        "availableBillingStreetNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableBillingFloorNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableBillingDoorNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableBillingEntranceNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "availableBillingBuildingNumbers": {
          "typeRef": "#/domains/BroadbandSignupES/types/Strings"
        },
        "finalBillingAddress": {
          "typeRef": "#/domains/BroadbandSignupES/types/String"
        },
        "confirmation": {
          "typeRef": "#/domains/BroadbandSignupES/types/Confirmation"
        },
        "serviceTermsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when T&Cs are presented."
        },
        "broadbandPackageName": {
          "typeRef": "#/domains/BroadbandSignupES/types/String",
          "description": "Emitted when there is a single package available and selected."
        },
        "estimatedPriceBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem"
        },
        "estimatedPrice": {
          "typeRef": "#/domains/BroadbandSignupES/types/EstimatedPrice"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/BroadbandSignupES/types/FinalPrice"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "ServiceAddress": {
          "type": "object",
          "description": "Information about the property to be serviced.",
          "pii": true,
          "properties": {
            "street": {
              "type": "string",
              "minLength": 1,
              "example": "Da road"
            },
            "number": {
              "type": "string",
              "minLength": 1,
              "example": "93"
            },
            "postcode": {
              "$ref": "#/domains/BroadbandSignupES/types/Postcode"
            },
            "city": {
              "type": "string",
              "minLength": 1,
              "example": "Madrid"
            },
            "citySubdivision": {
              "type": "string",
              "minLength": 1,
              "example": "Madrid"
            },
            "region": {
              "type": "string",
              "example": "Madrid"
            }
          },
          "required": [
            "street",
            "number",
            "city"
          ],
          "additionalProperties": false
        },
        "AvailableDynamicOption": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignupES/types/AvailableOptionString"
            },
            {
              "$ref": "#/domains/BroadbandSignupES/types/AvailableOptionSelectOne"
            },
            {
              "$ref": "#/domains/BroadbandSignupES/types/AvailableOptionSelectMany"
            }
          ]
        },
        "AvailableOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/BroadbandSignupES/types/String"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/BroadbandSignupES/types/String"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "SelectedDynamicOption": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignupES/types/SelectedOptionString"
            },
            {
              "$ref": "#/domains/BroadbandSignupES/types/SelectedOptionSelectOne"
            },
            {
              "$ref": "#/domains/BroadbandSignupES/types/SelectedOptionSelectMany"
            },
            {
              "type": "null"
            }
          ]
        },
        "SelectedOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "text": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "text"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "$ref": "#/domains/BroadbandSignupES/types/String"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/BroadbandSignupES/types/String"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "Packages": {
          "type": "array",
          "description": "A list of packages.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/Package"
          }
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "All in One Package",
              "minLength": 1
            },
            "description": {
              "oneOf": [
                {
                  "$ref": "#/domains/Generic/types/StructuredTextItem"
                },
                {
                  "type": "string"
                }
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "image": {
              "$ref": "#/domains/Generic/types/Link"
            },
            "estimatedSpeed": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Customer's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "nationality": {
              "type": "string",
              "example": "Argentina"
            },
            "DNI": {
              "type": "string",
              "description": "Customer's national document of identity.",
              "example": "11111111H"
            },
            "NIE": {
              "type": "string",
              "description": "Customer's foreigner identification number.",
              "example": "Y-12345678-R"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "AvailableSetupDatesOrNull": {
          "type": "array",
          "description": "A list of setup dates.",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/SetupDate"
          }
        },
        "SetupDate": {
          "type": "string",
          "description": "Account details for direct debit.",
          "format": "date",
          "example": "2019-01-01"
        },
        "Postcode": {
          "type": "string",
          "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
          "minLength": 4,
          "example": "RM108DE"
        },
        "AvailableAddresses": {
          "type": "array",
          "description": "A list of addresses.",
          "minItems": 1,
          "items": {
            "type": "string"
          }
        },
        "Boolean": {
          "type": "boolean",
          "enum": [
            true,
            false
          ]
        },
        "LandlineOptions": {
          "type": "object",
          "description": "Landline options.",
          "properties": {
            "keepPhoneNumber": {
              "type": "boolean"
            },
            "phoneNumber": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "serviceProvider": {
              "type": "string",
              "example": "dodo"
            },
            "owner": {
              "$ref": "#/domains/BroadbandSignupES/types/Person"
            }
          },
          "required": [
            "keepPhoneNumber"
          ],
          "additionalProperties": false
        },
        "ServiceAddresses": {
          "type": "array",
          "description": "A list of service addresses.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/String"
          }
        },
        "BillingAddresses": {
          "type": "array",
          "description": "A list of billing addresses.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/String"
          }
        },
        "ServiceProviders": {
          "type": "array",
          "description": "A list of providers.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/String"
          }
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "PIIString": {
          "type": "string",
          "pii": true
        },
        "StringsOrNull": {
          "oneOf": [
            {
              "type": "array",
              "items": {
                "$ref": "#/domains/BroadbandSignupES/types/String"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "Strings": {
          "type": "array",
          "items": {
            "$ref": "#/domains/BroadbandSignupES/types/String"
          }
        },
        "EstimatedPrice": {
          "oneOf": [
            {
              "$ref": "#/domains/BroadbandSignupES/types/FinalPrice"
            },
            {
              "$ref": "#/domains/BroadbandSignupES/types/String"
            }
          ]
        },
        "String": {
          "type": "string"
        },
        "FinalPrice": {
          "type": "object",
          "properties": {
            "now": {
              "type": "string"
            },
            "monthly": {
              "type": "string"
            },
            "monthlyDiscounted": {
              "type": "string"
            }
          },
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "ContactUsToContinue",
          "category": "client",
          "description": "The user being asked to contact the supplier to continue the purchase."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The user being signed up is already a customer of this service."
        },
        {
          "code": "PackageNotAvailable",
          "category": "client",
          "description": "The package is not avaialbe."
        },
        {
          "code": "BankDetailsInvalid",
          "category": "client",
          "description": "Bank details invalid."
        },
        {
          "code": "DirectDebitRejected",
          "category": "client",
          "description": "Direct debit details rejected."
        },
        {
          "code": "LandlineMandatory",
          "category": "client",
          "description": "The landline is mandatory, but not either not provided or not valid."
        },
        {
          "code": "LandlineInvalid",
          "category": "client",
          "description": "The landline is not valid."
        },
        {
          "code": "OfferNotAvailable",
          "category": "client",
          "description": "The offer is not available, usually expired or not applicable to the user or client."
        }
      ]
    },
    "Checkin": {
      "description": "Allows automating hotel booking check-in.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/Checkin/types/Account",
          "description": "If required, used for logging in."
        },
        "bookingReference": {
          "typeRef": "#/domains/Checkin/types/PiiString",
          "description": "Hotel booking reference code."
        },
        "checkInText": {
          "typeRef": "#/domains/Checkin/types/PiiString",
          "description": "Optional comment made by the hotel regarding the check-in status."
        }
      },
      "outputs": {},
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        },
        {
          "code": "ContactDetailsInvalid",
          "category": "client",
          "description": "Invalid contact details."
        }
      ]
    },
    "ClickoutTRV": {
      "description": "Spidering Trivago to get a Forwarder Url.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "advertiser_id": {
          "typeRef": "#/domains/ClickoutTRV/types/String"
        },
        "trv_email": {
          "typeRef": "#/domains/ClickoutTRV/types/String"
        },
        "trv_password": {
          "typeRef": "#/domains/ClickoutTRV/types/String"
        }
      },
      "outputs": {
        "forwarder_url": {
          "typeRef": "#/domains/ClickoutTRV/types/String"
        },
        "clickout_price": {
          "typeRef": "#/domains/Generic/types/Price"
        }
      },
      "types": {
        "String": {
          "type": "string"
        },
        "Email": {
          "type": "string",
          "format": "email"
        }
      },
      "errors": []
    },
    "CoachBooking": {
      "description": "Automates bus and chack tickets booking on websites.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to one of the checkout flow pages."
        },
        "search": {
          "typeRef": "#/domains/CoachBooking/types/Search",
          "initial": true
        },
        "selectedOutboundTrip": {
          "typeRef": "#/domains/CoachBooking/types/Trip",
          "sourceOutputKey": "availableOutboundTrips",
          "inputMethod": "SelectOne"
        },
        "selectedInboundTrip": {
          "typeRef": "#/domains/CoachBooking/types/Trip",
          "sourceOutputKey": "availableInboundTrips",
          "inputMethod": "SelectOne"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account",
          "canonical": [
            "/email"
          ]
        },
        "passengers": {
          "typeRef": "#/domains/CoachBooking/types/Passengers"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "smsConfirmation": {
          "typeRef": "#/domains/CoachBooking/types/VerificationCode",
          "description": "An SMS confirmation for authorizing the payment. Occurs in some of the transactions in place of 3dsecure."
        },
        "options": {
          "typeRef": "#/domains/CoachBooking/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "availableOutboundTrips": {
          "typeRef": "#/domains/CoachBooking/types/Trips"
        },
        "availableInboundTrips": {
          "typeRef": "#/domains/CoachBooking/types/Trips"
        },
        "estimatedPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Price shown by the website prior to requiring passenger information.<br/>This is likely not the final price, as flight ancilliaries may be added as requested, or additional credit card charges may be applied."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/CoachBooking/types/BookingConfirmation"
        }
      },
      "types": {
        "Search": {
          "type": "object",
          "description": "Information about the trip.",
          "properties": {
            "outbound": {
              "$ref": "#/domains/CoachBooking/types/CoachSearch",
              "description": "Outbound trip specification."
            },
            "inbound": {
              "$ref": "#/domains/CoachBooking/types/CoachSearch",
              "description": "Inbound (return) trip specification. If omitted, one-way trip booking flow is used."
            },
            "passengerAges": {
              "$ref": "#/domains/Generic/types/Ages",
              "description": "Ages of all passengers.",
              "example": [
                34,
                31,
                9
              ]
            }
          },
          "required": [
            "outbound",
            "passengerAges"
          ],
          "additionalProperties": false
        },
        "CoachSearch": {
          "type": "object",
          "description": "Outbound and inbound trips specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/CoachBooking/types/DateTerminal"
            },
            "destination": {
              "$ref": "#/domains/CoachBooking/types/DateTerminal"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "DateTerminal": {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "format": "date",
              "description": "Date of trip (terminal local date).",
              "example": "2019-01-01"
            },
            "terminalLocality": {
              "type": "string",
              "description": "Terminal locality, usually city name.",
              "example": "London"
            },
            "terminalName": {
              "type": "string",
              "description": "Name of the terminal as found on the booking website.",
              "example": "London Liverpool Street"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of the terminal.",
              "example": "gb"
            }
          },
          "required": [
            "date",
            "terminalLocality",
            "terminalName"
          ],
          "additionalProperties": false
        },
        "Trips": {
          "type": "array",
          "description": "An array of trips.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/CoachBooking/types/Trip"
          }
        },
        "Trip": {
          "type": "object",
          "description": "Outbound and inbound specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/CoachBooking/types/DateTimeTerminal"
            },
            "destination": {
              "$ref": "#/domains/CoachBooking/types/DateTimeTerminal"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "DateTimeTerminal": {
          "type": "object",
          "properties": {
            "dateTime": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "description": "Date and time (terminal local time).",
              "example": "2018-02-02 19:40"
            },
            "terminalLocality": {
              "type": "string",
              "description": "Terminal locality, usually city name.",
              "example": "London"
            },
            "terminalName": {
              "type": "string",
              "description": "Name of the terminal as found on the booking website.",
              "example": "London Liverpool Street"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of the terminal.",
              "example": "gb"
            }
          },
          "required": [
            "dateTime",
            "terminalLocality",
            "terminalName"
          ],
          "additionalProperties": false
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/CoachBooking/types/Passenger"
          }
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "addAdditionalLuggage": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3,
              "default": 0
            },
            "document": {
              "$ref": "#/domains/CoachBooking/types/PassengerDocument"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth",
            "addAdditionalLuggage"
          ],
          "additionalProperties": false
        },
        "PassengerDocument": {
          "type": "object",
          "description": "Passenger ID (passport or other travel document). Automation may fail if this information is required by website, but not provided by Client.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number",
            "expirationDate",
            "issueCountryCode"
          ],
          "additionalProperties": false
        },
        "VerificationCode": {
          "type": "object",
          "description": "Verification code",
          "properties": {
            "code": {
              "type": "string",
              "example": "1234"
            }
          },
          "required": [
            "code"
          ]
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features such as upsells and additional features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end."
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        }
      },
      "errors": [
        {
          "code": "TripInvalid",
          "category": "client",
          "description": "Trip details are invalid."
        },
        {
          "code": "OutboundTripNotAvailable",
          "category": "client",
          "description": "Outbound trip dates/times are not available, either sold out or not found."
        },
        {
          "code": "ExtraLuggageNotAvailable",
          "category": "client",
          "description": "The website does not allow adding additional luggage."
        },
        {
          "code": "ExtraLuggageLimitExceeded",
          "category": "client",
          "description": "The website does not allow adding the amount of additional luggage specified in the input."
        },
        {
          "code": "PassengerDetailsInvalid",
          "category": "client",
          "description": "The website invalidates some of the passenger details."
        },
        {
          "code": "DocumentDetailsInavlid",
          "category": "client",
          "description": "The website invalidates the document details."
        },
        {
          "code": "SeatsNotAvailable",
          "category": "client",
          "description": "The website claims that either no seats are available, or the selected seats are not available."
        }
      ]
    },
    "ContestSignup": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "agentLogin": {
          "typeRef": "#/domains/ContestSignup/types/Account"
        },
        "account": {
          "typeRef": "#/domains/ContestSignup/types/Account",
          "canonical": [
            "/email"
          ]
        },
        "dynamicAccount": {
          "typeRef": "#/domains/ContestSignup/types/Account",
          "dynamic": true
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "dynamicPayment": {
          "typeRef": "#/domains/Generic/types/Payment",
          "dynamic": true
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "dynamicPanToken": {
          "typeRef": "#/domains/Generic/types/PanToken",
          "dynamic": true
        },
        "priceRange": {
          "typeRef": "#/domains/Generic/types/PriceRange",
          "description": "Acceptable price range. Prices within this range are acceptable and purchases will be automatically confirmed."
        },
        "selectedEvent": {
          "typeRef": "#/domains/ContestSignup/types/Event",
          "sourceOutputKey": "availableEvents",
          "inputMethod": "SelectOne"
        },
        "selectedEntries": {
          "typeRef": "#/domains/ContestSignup/types/Entries",
          "sourceOutputKey": "availableEntries",
          "inputMethod": "SelectMany"
        },
        "selectedEventOptions": {
          "typeRef": "#/domains/ContestSignup/types/SelectedOptions"
        },
        "participants": {
          "typeRef": "#/domains/ContestSignup/types/Participants"
        },
        "options": {
          "typeRef": "#/domains/ContestSignup/types/Options",
          "default": {},
          "initial": true
        },
        "discount": {
          "typeRef": "#/domains/ContestSignup/types/Discount"
        },
        "emergencyContact": {
          "typeRef": "#/domains/ContestSignup/types/EmergencyContact"
        },
        "selectedDynamicOption": {
          "typeRef": "#/domains/ContestSignup/types/SelectedDynamicOption",
          "dynamic": true
        }
      },
      "outputs": {
        "authenticationTerms": {
          "typeRef": "#/domains/ContestSignup/types/Terms"
        },
        "registrationWaivers": {
          "typeRef": "#/domains/ContestSignup/types/Terms"
        },
        "availableEvents": {
          "typeRef": "#/domains/ContestSignup/types/Events"
        },
        "availableEntries": {
          "typeRef": "#/domains/ContestSignup/types/Entries"
        },
        "availableEventOptions": {
          "typeRef": "#/domains/ContestSignup/types/AvailableOptions"
        },
        "availableParticipantOptions": {
          "typeRef": "#/domains/ContestSignup/types/AvailableOptions"
        },
        "availableDynamicOptions": {
          "typeRef": "#/domains/ContestSignup/types/AvailableDynamicOption",
          "dynamic": true
        },
        "visibleOptions": {
          "typeRef": "#/domains/ContestSignup/types/VisibleOptions"
        },
        "existingAccountDetails": {
          "typeRef": "#/domains/ContestSignup/types/ExistingAccountDetails"
        },
        "priceBreakdown": {
          "typeRef": "#/domains/ContestSignup/types/PriceBreakdown",
          "description": "The list of price components, as found on the website."
        },
        "confirmation": {
          "typeRef": "#/domains/ContestSignup/types/Confirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features such as upsells and additional features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "success": {
              "type": "boolean",
              "description": "If <code>true</code>, returns a fake success without making a booking.",
              "default": false
            },
            "dynamicPayment": {
              "type": "boolean",
              "default": false
            },
            "dynamicAccount": {
              "type": "boolean",
              "default": false
            },
            "metadataId": {
              "type": "string",
              "description": "Metadata ID",
              "default": ""
            }
          }
        },
        "Terms": {
          "type": "array",
          "items": {
            "typeRef": "#/domains/Generic/types/StructuredTextItem"
          }
        },
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "person": {
              "$ref": "#/domains/ContestSignup/types/PersonDob"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "securityQuestion": {},
            "securityAnswer": {}
          },
          "required": [
            "email",
            "isExisting"
          ],
          "additionalProperties": false
        },
        "PersonDob": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "Events": {
          "type": "array",
          "description": "A list of events.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/ContestSignup/types/Event"
          }
        },
        "Event": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "startDate": {
              "type": "string",
              "format": "date"
            },
            "startTime": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "strikePrice": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "name"
          ]
        },
        "Entries": {
          "type": "array",
          "description": "A list of possible entries.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/ContestSignup/types/Entry"
          }
        },
        "Entry": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "count": {
              "type": "integer"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "name"
          ]
        },
        "Participants": {
          "type": "array",
          "description": "A list of participants.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/ContestSignup/types/Participant"
          }
        },
        "Participant": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "membership": {
              "description": "Personal membership details.",
              "$ref": "#/domains/ContestSignup/types/Membership"
            },
            "additionalOptions": {
              "description": "Additional personal details requested by the supplier.",
              "$ref": "#/domains/ContestSignup/types/SelectedOptions"
            },
            "address": {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            },
            "isRegistrantAccountOwner": {
              "description": "Specifies whether the participant is the account owner or not.",
              "default": false,
              "$ref": "#/domains/ContestSignup/types/Boolean"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth",
            "email",
            "phone"
          ],
          "additionalProperties": false
        },
        "Membership": {
          "type": "object",
          "description": "Membership details.",
          "properties": {
            "organisation": {
              "type": "string",
              "example": "Run for Us"
            },
            "number": {
              "type": "string",
              "example": "rfu-12345"
            }
          },
          "additionalProperties": false,
          "required": [
            "number"
          ]
        },
        "Discount": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "code": {
              "type": "string",
              "description": "Discount code",
              "example": "RL2XYZ"
            }
          },
          "additionalProperties": false,
          "required": [
            "code"
          ]
        },
        "EmergencyContact": {
          "type": "object",
          "description": "Emergency contact details.",
          "properties": {
            "name": {
              "type": "string"
            },
            "phone": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": [
            "name",
            "phone"
          ]
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            }
          },
          "additionalProperties": false,
          "required": []
        },
        "AvailableDynamicOption": {
          "oneOf": [
            {
              "$ref": "#/domains/ContestSignup/types/AvailableOptionString"
            },
            {
              "$ref": "#/domains/ContestSignup/types/AvailableOptionSelectOne"
            },
            {
              "$ref": "#/domains/ContestSignup/types/AvailableOptionSelectMany"
            }
          ]
        },
        "AvailableOptions": {
          "type": "array",
          "description": "Additional options to be filled in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/ContestSignup/types/AvailableOptionString"
              },
              {
                "$ref": "#/domains/ContestSignup/types/AvailableOptionSelectOne"
              },
              {
                "$ref": "#/domains/ContestSignup/types/AvailableOptionSelectMany"
              }
            ]
          }
        },
        "AvailableOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/ContestSignup/types/OptionWithPrice"
              }
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/ContestSignup/types/OptionWithPrice"
              }
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "SelectedDynamicOption": {
          "oneOf": [
            {
              "$ref": "#/domains/ContestSignup/types/SelectedOptionString"
            },
            {
              "$ref": "#/domains/ContestSignup/types/SelectedOptionSelectOne"
            },
            {
              "$ref": "#/domains/ContestSignup/types/SelectedOptionSelectMany"
            },
            {
              "type": "null"
            }
          ]
        },
        "SelectedOptions": {
          "type": "array",
          "description": "Additional options to fill in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/ContestSignup/types/SelectedOptionString"
              },
              {
                "$ref": "#/domains/ContestSignup/types/SelectedOptionSelectOne"
              },
              {
                "$ref": "#/domains/ContestSignup/types/SelectedOptionSelectMany"
              }
            ]
          }
        },
        "SelectedOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "text": {
              "type": "string"
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "inputType",
            "label",
            "text"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "$ref": "#/domains/ContestSignup/types/OptionWithPrice"
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "$ref": "#/domains/ContestSignup/types/OptionWithPrice"
              }
            },
            "isMandatory": {
              "type": "boolean"
            },
            "images": {
              "$ref": "#/domains/ContestSignup/types/Images"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "OptionWithPrice": {
          "type": "object",
          "description": "Additional options to be filled in, visible to the automation at that point in time.",
          "properties": {
            "label": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "label"
          ],
          "additionalProperties": false
        },
        "VisibleOptions": {
          "type": "array",
          "description": "Additional options to be filled in, visible to the automation at that point in time.",
          "properties": {
            "label": {
              "type": "string"
            }
          },
          "required": [
            "label"
          ],
          "additionalProperties": false
        },
        "Images": {
          "type": "array",
          "description": "Relevant images.",
          "items": {
            "$ref": "#/domains/Generic/types/Link"
          }
        },
        "PriceBreakdown": {
          "type": "array",
          "description": "The list of price components, as found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/ContestSignup/types/PriceBreakdownItem"
          }
        },
        "PriceBreakdownItem": {
          "type": "object",
          "description": "A component of the price breakdown.",
          "properties": {
            "text": {
              "type": "string",
              "description": "The description of an item on the price breakdown list, as found on the website.",
              "example": "Credit card charge"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "text",
            "price"
          ]
        },
        "ExistingAccountDetails": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/Generic/types/NamedText"
          }
        },
        "Boolean": {
          "type": "boolean"
        }
      },
      "errors": [
        {
          "code": "InvalidAdditionalParticipantOptions",
          "category": "client",
          "description": "The participants/*/additionalOptions is invalid."
        },
        {
          "code": "InvalidParticipantDetails",
          "category": "client",
          "description": "One of the participants' details are invalid."
        },
        {
          "code": "EntriesNotAvailable",
          "category": "client",
          "description": "One or more entries are not available."
        },
        {
          "code": "EventNotAvailable",
          "category": "client",
          "description": "The event is not available."
        },
        {
          "code": "EventRegistrationEnded",
          "category": "client",
          "description": "The registration for this event ended."
        },
        {
          "code": "InvalidPassword",
          "category": "client",
          "description": "The specified password is not valid."
        },
        {
          "code": "AccountAlreadyExists",
          "category": "client",
          "description": "The specified account already exists."
        },
        {
          "code": "ParticipantAlreadyRegistered",
          "category": "client",
          "description": "The specified participant is already registered."
        },
        {
          "code": "AccountLocked",
          "category": "client",
          "description": "The specified account is not accessible."
        }
      ]
    },
    "CreditCardApplication": {
      "description": "Allows applying for business credit cards.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "applicant": {
          "typeRef": "#/domains/CreditCardApplication/types/Applicant"
        },
        "employment": {
          "typeRef": "#/domains/CreditCardApplication/types/Employment"
        },
        "mobilePinConfirmation": {
          "typeRef": "#/domains/CreditCardApplication/types/MobilePinConfirmation"
        },
        "options": {
          "typeRef": "#/domains/CreditCardApplication/types/Options",
          "default": {},
          "initial": true
        },
        "company": {
          "typeRef": "#/domains/CreditCardApplication/types/Company"
        },
        "selectedAnswers": {
          "typeRef": "#/domains/CreditCardApplication/types/Answers"
        }
      },
      "outputs": {
        "availableQuestions": {
          "typeRef": "#/domains/CreditCardApplication/types/Questions"
        },
        "debug": {
          "typeRef": "#/domains/CreditCardApplication/types/Anything"
        },
        "keyTerms": {
          "typeRef": "#/domains/CreditCardApplication/types/KeyTerms"
        },
        "confirmation": {
          "typeRef": "#/domains/CreditCardApplication/types/Confirmation"
        }
      },
      "types": {
        "Applicant": {
          "type": "object",
          "description": "The person applying for the credit card.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "mainAddress": {
              "description": "A list of addresses for the applicant.",
              "$ref": "#/domains/CreditCardApplication/types/Address"
            },
            "otherAddresses": {
              "type": "array",
              "description": "A list of addresses for the applicant.",
              "pii": true,
              "minItems": 1,
              "maxItems": 9,
              "items": {
                "$ref": "#/domains/CreditCardApplication/types/Address"
              }
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            }
          },
          "required": [
            "person",
            "mainAddress",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "Address": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Street name.",
              "minLength": 1,
              "example": "Twin Peaks Blv."
            },
            "houseName": {
              "type": "string",
              "description": "House name.",
              "minLength": 1,
              "example": "Orchard House."
            },
            "houseNumber": {
              "type": "string",
              "description": "House number.",
              "minLength": 1,
              "example": "501"
            },
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "minLength": 1,
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            },
            "dateMovedIn": {
              "type": "string",
              "format": "date",
              "description": "Date at which the applicant moved into this address."
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "own",
                "family",
                "rent-unfurnished",
                "rent-furnished",
                "rent-council",
                "rent-other",
                "share",
                "living-with-parents"
              ]
            },
            "mortgage": {
              "$ref": "#/domains/CreditCardApplication/types/Mortgage"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Mortgage": {
          "type": "object",
          "description": "Mortgage information for the associated address.",
          "pii": true,
          "properties": {
            "monthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month by the credit card applicant."
            },
            "jointMonthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month for a joint mortgage."
            }
          },
          "required": [
            "monthlyPayment"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "description": "Applicant employment details.",
          "pii": true,
          "properties": {
            "companyName": {
              "type": "string",
              "minLength": 1
            },
            "industry": {
              "type": "string",
              "minLength": 1
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "employed-fulltime",
                "employed-parttime",
                "unemployed",
                "homemaker",
                "self-employed",
                "on-benefits",
                "retired",
                "student"
              ]
            },
            "jobTitle": {
              "type": "string",
              "minLength": 1,
              "description": "Job title.",
              "example": "Computer programmer"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "grossIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual gross salary (before tax)."
            },
            "netIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual net salary (after tax)."
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        "Company": {
          "type": "object",
          "description": "Applicant company details.",
          "pii": true,
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "industry": {
              "type": "string",
              "minLength": 1
            },
            "isFreelancer": {
              "type": "boolean"
            },
            "employees": {
              "type": "number",
              "description": "The number employees in the company.",
              "example": 48
            },
            "monthlyExpenses": {
              "type": "string",
              "description": "Expected monthly spend on your account.",
              "minLength": 1
            },
            "annualRevenue": {
              "type": "string",
              "description": "Company's annual revenue.",
              "minLength": 1
            },
            "nameOnCard": {
              "type": "string",
              "description": "Business name on card.",
              "minLength": 1
            },
            "hasWebsite": {
              "type": "boolean"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "MobilePinConfirmation": {
          "type": "object",
          "description": "Mobile pin confirmation to confirm the applicant's mobile number.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "pin confirmation code.",
              "example": "1234",
              "minLength": 3,
              "maxLength": 10
            }
          },
          "required": [
            "code"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Confirmation of the credit card.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "Credit card confirmation code",
              "example": "1234"
            },
            "message": {
              "type": "string",
              "description": "Confirmation message from the web page.",
              "example": "Your credit card application is confirmed."
            },
            "savedUrl": {
              "$ref": "#/domains/Generic/types/Link"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "skipMobilePinVerification": {
              "type": "boolean",
              "default": false
            },
            "continueAfterSubmittingUrl": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Answers": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/CreditCardApplication/types/Answer"
          }
        },
        "Answer": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1,
              "example": "How much do you earn per month?"
            },
            "value": {
              "type": "string",
              "example": "2000"
            }
          },
          "required": [
            "key",
            "value"
          ],
          "additionalProperties": false
        },
        "Questions": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/CreditCardApplication/types/Question"
          }
        },
        "Question": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "key"
          ],
          "additionalProperties": false
        },
        "Anything": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array"
            },
            {
              "type": "object"
            },
            {
              "type": "boolean"
            }
          ]
        },
        "KeyTerms": {
          "type": "object",
          "pii": true,
          "properties": {
            "creditCardLimit": {
              "type": "integer",
              "minLength": 1
            },
            "term": {
              "type": "integer",
              "minLength": 1
            },
            "minimumMonthlyRepayment": {
              "type": "integer",
              "minLength": 1
            },
            "apr": {
              "type": "integer",
              "minLength": 1
            },
            "totalAmountPayable": {
              "type": "integer",
              "minLength": 1
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "ConnectionReset",
          "category": "website",
          "description": "The supplier reset the TCP connection."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The customer already has an account with this provider."
        },
        {
          "code": "CreditCardApplicationDeclined",
          "category": "client",
          "description": "Credit card application denied by provider."
        },
        {
          "code": "MobilePinVerificationFailed",
          "category": "client",
          "description": "Pin verification failed."
        }
      ]
    },
    "ElectronicTravelAuthorisation": {
      "description": "Allows automating ETAs.",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "options": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either login page or further down the funnel.",
          "initial": true
        },
        "agent": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Agent"
        },
        "applicant": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Applicant"
        },
        "relativesNotAccompanyingApplicant": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Relatives"
        },
        "selectedEmploymentDomain": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/SelectedOption"
        },
        "selectedEmploymentJobTitle": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/SelectedOption"
        },
        "selectedVisitPurpose": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/SelectedOption"
        },
        "emailConfirmationUrl": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "URL provided via confirmation email."
        },
        "application": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Application"
        },
        "identityCardPhoto": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of applicant identity card. Used for visa validation."
        },
        "businessInvitationLetter": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of applicant invitation letter."
        },
        "companyRegistrationDocument": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of company registration document. Used when travel for bussines."
        },
        "travelItineraryDocument": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of travel itinerary. Used for bussines and tourism."
        },
        "visaApplication": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of visa application. Used for bussines and tourism."
        },
        "residencyCardDocument": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of residency card. Used for bussines and tourism."
        },
        "hotelBookingConfirmationDocument": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/NullableDocument",
          "description": "A photo of hotel booking confirmation document."
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided."
        },
        "cbpGlobalEntryProgramMembership": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/String"
        },
        "previousApplicationVisaNumber": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/PreviousApplicationVisaNumber"
        },
        "residencyPermit": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/ResidencyPermit"
        }
      },
      "outputs": {
        "availableEmploymentDomains": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/AvailableOptions"
        },
        "availableEmploymentJobTitles": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/AvailableOptions"
        },
        "availableVisitPurposes": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/AvailableOptions"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "confirmation": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/Confirmation"
        },
        "applicationReference": {
          "typeRef": "#/domains/ElectronicTravelAuthorisation/types/String"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "additionalProperties": false
        },
        "String": {
          "type": "string"
        },
        "ResidencyPermit": {
          "type": "object",
          "properties": {
            "number": {
              "type": "string"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "number",
            "expirationDate"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "code": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": []
        },
        "Application": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "purpose": {
              "type": "string",
              "enum": [
                "business",
                "tourist",
                "transit",
                ""
              ]
            },
            "purposeDescription": {
              "type": "string"
            },
            "entries": {
              "type": "integer"
            },
            "arrivalDate": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/DateOrEmptyString",
              "description": "Entry date in YYYY-MM-DD format."
            },
            "departureDateTime": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/DateTimeOrEmptyString",
              "description": "Date and time of departure (UTC)."
            },
            "destinationContact": {
              "properties": {
                "name": {
                  "type": "string"
                },
                "address": {
                  "type": "object",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
                },
                "email": {
                  "type": "string",
                  "description": "Typically used for contact details.",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "description": "Phone number.",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/Phone"
                }
              },
              "required": [],
              "additionalProperties": false
            },
            "transitContact": {
              "properties": {
                "name": {
                  "type": "string"
                },
                "address": {
                  "type": "object",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
                },
                "email": {
                  "type": "string",
                  "description": "Typically used for contact details.",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "description": "Phone number.",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/Phone"
                }
              },
              "required": [],
              "additionalProperties": false
            },
            "wasRequestedBefore": {
              "type": "boolean"
            },
            "transportation": {
              "type": "string",
              "enum": [
                "aeroplane",
                "ship",
                "land",
                ""
              ]
            },
            "pointOfEntry": {
              "type": "string",
              "description": "The border point of entry. Port, airport or border name."
            },
            "isTransit": {
              "type": "boolean"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AvailableOptions": {
          "type": "array",
          "items": {
            "$ref": "#/domains/ElectronicTravelAuthorisation/types/SelectedOption"
          }
        },
        "SelectedOption": {
          "type": "string"
        },
        "Agent": {
          "type": "object",
          "properties": {
            "person": {
              "type": "object",
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/Person"
            },
            "organisation": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "address": {
                  "type": "object",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
                }
              },
              "required": [
                "name",
                "address"
              ],
              "additionalProperties": false
            },
            "phone": {
              "description": "Phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "email": {
              "type": "string",
              "description": "Account email, typically used for contact details.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully.",
              "format": "email",
              "example": "hello@example.com"
            }
          },
          "required": [
            "person",
            "organisation",
            "phone",
            "email"
          ],
          "additionalProperties": false
        },
        "Applicant": {
          "type": "object",
          "properties": {
            "person": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/Person"
            },
            "homeAddress": {
              "type": "object",
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
            },
            "contact": {
              "type": "object",
              "properties": {
                "address": {
                  "type": "object",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
                },
                "email": {
                  "type": "string",
                  "description": "Applicant email, typically used for contact details.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully.",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "description": "Phone number, may also be used as contact details.",
                  "$ref": "#/domains/Generic/types/Phone"
                }
              },
              "required": [
                "address",
                "email",
                "phone"
              ],
              "additionalProperties": false
            },
            "emergencyContact": {
              "type": "object",
              "properties": {
                "person": {
                  "type": "object",
                  "$ref": "#/domains/ElectronicTravelAuthorisation/types/Person"
                },
                "email": {
                  "type": "string",
                  "description": "Applicant email, typically used for contact details.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully.",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "description": "Phone number, may also be used as contact details.",
                  "$ref": "#/domains/Generic/types/Phone"
                }
              },
              "required": [
                "person",
                "email",
                "phone"
              ],
              "additionalProperties": false
            },
            "documents": {
              "type": "array",
              "items": {
                "$ref": "#/domains/ElectronicTravelAuthorisation/types/Passport"
              }
            },
            "employment": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/Employment"
            },
            "nationalIdentityNumber": {
              "type": "string",
              "description": "Where applicable, citizens of certain countries are assigned a unique national identity number, usually at birth, which never changes."
            },
            "otherNationalities": {
              "type": "array",
              "items": {
                "$ref": "#/domains/ElectronicTravelAuthorisation/types/OtherNationality"
              }
            }
          },
          "required": [
            "person",
            "documents"
          ],
          "additionalProperties": false
        },
        "Relatives": {
          "type": "array",
          "items": {
            "$ref": "#/domains/ElectronicTravelAuthorisation/types/Relative"
          }
        },
        "Relative": {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            },
            "age": {
              "type": "integer"
            },
            "relationship": {
              "type": "string",
              "description": "Relationship to the applicant.",
              "example": "Child"
            }
          },
          "required": [
            "firstName",
            "lastName",
            "relationship"
          ],
          "additionalProperties": false
        },
        "OtherNationality": {
          "type": "object",
          "properties": {
            "isCurrent": {
              "type": "boolean"
            },
            "obtainedBy": {
              "type": "string",
              "description": "",
              "enum": [
                "birth",
                "parents",
                "naturalisation",
                "other"
              ]
            },
            "obtainedOtherReason": {
              "type": "string",
              "description": "When obtainedBy is 'other', this entry is mandatory."
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            }
          },
          "required": [
            "isCurrent",
            "obtainedBy",
            "countryCode"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "employed",
                "self-employed",
                "student",
                "retired",
                "unemployed"
              ]
            },
            "name": {
              "type": "string"
            },
            "address": {
              "type": "object",
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/ExplicitAddress"
            },
            "businessType": {
              "type": "string"
            },
            "occupation": {
              "type": "string"
            },
            "jobTitle": {
              "type": "string"
            },
            "phone": {
              "description": "Phone number, may also be used as contact details.",
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/Phone"
            },
            "startDate": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/DateOrEmptyString",
              "description": "Employment start date in YYYY-MM-DD format."
            }
          },
          "required": [
            "name",
            "address",
            "businessType",
            "occupation",
            "jobTitle",
            "phone",
            "startDate"
          ],
          "additionalProperties": false
        },
        "DateTimeOrEmptyString": {
          "oneOf": [
            {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "example": "2020-02-02 19:40"
            },
            {
              "type": "string",
              "enum": [
                ""
              ]
            }
          ]
        },
        "DateOrEmptyString": {
          "oneOf": [
            {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            {
              "type": "string",
              "enum": [
                ""
              ]
            }
          ]
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "",
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "gender": {
              "type": "string",
              "description": "",
              "enum": [
                "male",
                "female",
                "transgender"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            },
            "alias": {
              "type": "object",
              "properties": {
                "firstName": {
                  "type": "string",
                  "description": "First name(s) or given name(s), as specified in ID.",
                  "example": "Bob"
                },
                "lastName": {
                  "type": "string",
                  "description": "Last name or surname, as specified in ID.",
                  "example": "Smith"
                }
              },
              "required": [
                "firstName",
                "lastName"
              ],
              "additionalProperties": false
            },
            "birthDatePlace": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "description": "Applicant's date of birth in YYYY-MM-DD format.",
                  "format": "date",
                  "example": "1976-01-27"
                },
                "city": {},
                "countryCode": {
                  "$ref": "#/domains/Generic/types/CountryCode"
                }
              },
              "required": [
                "date",
                "city",
                "countryCode"
              ],
              "additionalProperties": false
            },
            "civilStatus": {
              "type": "string",
              "enum": [
                "single",
                "married",
                "civil partnership"
              ]
            },
            "parentsNames": {
              "type": "object",
              "properties": {
                "father": {
                  "type": "object",
                  "description": "Basic information about father's identity.",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "mr.",
                      "enum": [
                        "",
                        "mr",
                        "miss",
                        "ms",
                        "mrs"
                      ]
                    },
                    "firstName": {
                      "type": "string",
                      "description": "First name(s) or given name(s), of person's father.",
                      "example": "Bob"
                    },
                    "middleName": {
                      "type": "string",
                      "default": "",
                      "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
                    },
                    "lastName": {
                      "type": "string",
                      "description": "Last name or surname, of person's father.",
                      "example": "Smith"
                    }
                  },
                  "required": [
                    "firstName",
                    "lastName"
                  ],
                  "additionalProperties": false
                },
                "mother": {
                  "type": "object",
                  "description": "Basic information about mother's identity.",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "mr.",
                      "enum": [
                        "",
                        "mr",
                        "miss",
                        "ms",
                        "mrs"
                      ]
                    },
                    "firstName": {
                      "type": "string",
                      "description": "First name(s) or given name(s), of person's mother.",
                      "example": "Bob"
                    },
                    "middleName": {
                      "type": "string",
                      "default": "",
                      "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
                    },
                    "lastName": {
                      "type": "string",
                      "description": "Last name or surname, of person's mother.",
                      "example": "Smith"
                    }
                  },
                  "required": [
                    "firstName",
                    "lastName"
                  ],
                  "additionalProperties": false
                }
              },
              "additionalProperties": false
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "Passport": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "ordinary",
                "diplomatic",
                "official",
                "service",
                "temporary"
              ]
            },
            "nationality": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/CountryCodeOrEmptyString"
            },
            "citizenship": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/CountryCodeOrEmptyString"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "issuePlace": {
              "type": "string"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "bioDataPagePhoto": {
              "typeRef": "#/domains/Generic/types/File",
              "description": "A photo with passport details section. Used for passport validation."
            },
            "photo": {
              "typeRef": "#/domains/Generic/types/File",
              "description": "Applicant passport photo. Used for passport validation."
            }
          },
          "required": [
            "type",
            "issueCountryCode",
            "expirationDate",
            "number"
          ],
          "additionalProperties": false
        },
        "ExplicitAddress": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Street name without number.",
              "example": "Twin Peaks Blv"
            },
            "streetNumberOrHouseName": {
              "type": "string",
              "description": "Street number or house name.",
              "example": "Buckingham Palace"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "example": "San Francisco"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/CountryCodeOrEmptyString"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Phone": {
          "type": "object",
          "description": "Phone information, typically used on contact details pages.",
          "pii": true,
          "properties": {
            "countryCode": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/CountryCodeOrEmptyString"
            },
            "number": {
              "type": "string",
              "description": "Mobile phone number (numbers only, excluding country code).",
              "example": "123456789"
            }
          },
          "required": [
            "countryCode",
            "number"
          ],
          "additionalProperties": false
        },
        "CountryCodeOrEmptyString": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            {
              "type": "string",
              "enum": [
                ""
              ]
            }
          ]
        },
        "NullableDocument": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/File"
            },
            {
              "type": "null"
            }
          ]
        },
        "PreviousApplicationVisaNumber": {
          "oneOf": [
            {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/String"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "errors": [
        {
          "code": "DocumentDetailsInvalid",
          "category": "client",
          "description": "Document details invalid or not acceptable."
        },
        {
          "code": "ApplicantDetailsInvalid",
          "category": "client",
          "description": "Applicant details invalid or not acceptable."
        },
        {
          "code": "ApplicationAlreadyExists",
          "category": "client",
          "description": "An application for this data already exists."
        }
      ]
    },
    "EventBooking": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account",
          "canonical": [
            "/email"
          ]
        },
        "accountPassword": {
          "typeRef": "#/domains/EventBooking/types/AccountPassword"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "deliveryAddress": {
          "typeRef": "#/domains/Generic/types/Address"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "selectedDelivery": {
          "typeRef": "#/domains/EventBooking/types/Delivery",
          "description": "Requested when delivery choices are required by website.<br/>At this point <code>availableDeliveries</code> output should contain information about available delivery options.<br/>Note: on deep links with pre-selected delivery options, this input might not required.<br/>Automation may fail if the incorrect option is specified, or if the delivery option is no longer available, for example, for a late or same day booking.",
          "sourceOutputKey": "availableDeliveries",
          "inputMethod": "SelectOne"
        },
        "options": {
          "typeRef": "#/domains/EventBooking/types/Options",
          "default": {},
          "initial": true
        },
        "selectedRefund": {
          "typeRef": "#/domains/EventBooking/types/SelectedRefund",
          "sourceOutputKey": "availableRefunds",
          "inputMethod": "SelectOne"
        },
        "selectedSeats": {
          "typeRef": "#/domains/EventBooking/types/Seats"
        },
        "selectedMarketingContactOptions": {
          "typeRef": "#/domains/EventBooking/types/SelectedItem",
          "description": "List of marketing contact options to be selected.",
          "sourceOutputKey": "availableMarketingContactOptions",
          "inputMethod": "SelectMany"
        },
        "selectedPerformance": {
          "typeRef": "#/domains/EventBooking/types/Performance",
          "description": "List of available scheduling dates, times and locations.",
          "sourceOutputKey": "availablePerformances",
          "inputMethod": "SelectOne"
        },
        "selectedUpsells": {
          "typeRef": "#/domains/EventBooking/types/Upsells",
          "description": "List of selected upsells.",
          "sourceOutputKey": "availableUpsells",
          "inputMethod": "SelectMany"
        },
        "overrideIntent": {
          "typeRef": "#/domains/EventBooking/types/Intent",
          "description": "List of intents."
        },
        "promoCode": {
          "typeRef": "#/domains/EventBooking/types/String"
        }
      },
      "outputs": {
        "tickets": {
          "description": "Emitted before finalPrice output. Contains information for the tickets about to be purchased by the job.",
          "typeRef": "#/domains/EventBooking/types/Tickets"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/EventBooking/types/BookingConfirmation"
        },
        "availableMarketingContactOptions": {
          "typeRef": "#/domains/EventBooking/types/StructuredTextItemsOrNull",
          "description": "List of marketing contact options provided."
        },
        "availableDeliveries": {
          "typeRef": "#/domains/EventBooking/types/AvailableDeliveriesOrNull",
          "description": "Emitted when actual delivery information is collected.<br/>Note: on deep links with pre-selected delivery, this output may not be provided."
        },
        "availableRefunds": {
          "typeRef": "#/domains/EventBooking/types/AvailableRefunds",
          "description": "Emitted when actual refund information is collected.<br/>Note: on deep links with pre-selected refund this output may not be provided."
        },
        "availableSeats": {
          "typeRef": "#/domains/EventBooking/types/Seats"
        },
        "availablePerformances": {
          "typeRef": "#/domains/EventBooking/types/Performances"
        },
        "availableUpsells": {
          "typeRef": "#/domains/EventBooking/types/Upsells"
        },
        "showName": {
          "typeRef": "#/domains/EventBooking/types/ShowName"
        },
        "seatsReserved": {
          "typeRef": "#/domains/EventBooking/types/Boolean"
        }
      },
      "types": {
        "ShowName": {
          "type": "string",
          "description": "Name of the show being booked."
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/EventBooking/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "Delivery": {
          "type": "object",
          "description": "Ticket delivery information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Delivery text as provided by the insurer.",
              "example": "Collection from venue, Royal Mail post, Courier delivery"
            },
            "price": {
              "$ref": "#/domains/EventBooking/types/Price"
            }
          },
          "required": [
            "name"
          ]
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features such as upsells and additional features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "refund": {
              "type": "boolean",
              "default": false
            },
            "marketingContact": {
              "type": "boolean",
              "default": false
            },
            "useDeliveryAddressAsBilling": {
              "type": "boolean",
              "default": false
            },
            "noDMTJobsBefore": {
              "type": "boolean",
              "default": false
            },
            "upsells": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "AvailableDeliveriesOrNull": {
          "oneOf": [
            {
              "type": "array",
              "description": "A list of available delivery options found on the page.",
              "minItems": 1,
              "maxItems": 9,
              "items": {
                "$ref": "#/domains/EventBooking/types/Delivery"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "AvailableRefunds": {
          "type": "array",
          "description": "A list of available refund options found on the page.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/EventBooking/types/Refund"
          }
        },
        "SelectedRefund": {
          "oneOf": [
            {
              "$ref": "#/domains/EventBooking/types/Refund"
            },
            {
              "type": "null"
            }
          ]
        },
        "Refund": {
          "type": "object",
          "description": "Refund information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Refund marketing text as provided by the insurer.",
              "example": "No-Matter-What, Medical Emergency Only"
            },
            "price": {
              "$ref": "#/domains/EventBooking/types/Price"
            }
          },
          "required": [
            "name"
          ]
        },
        "Upsells": {
          "type": "array",
          "description": "A list of upsells.",
          "items": {
            "$ref": "#/domains/EventBooking/types/Upsell"
          }
        },
        "Upsell": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "example": "Glass of wine"
            },
            "quantity": {
              "type": "integer",
              "minimum": 1,
              "description": "Count of items",
              "example": 2
            },
            "description": {
              "type": "string",
              "example": "This package contains amazing glasses of wine (actual drink not included)."
            },
            "price": {
              "$ref": "#/domains/EventBooking/types/Price"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Performances": {
          "type": "array",
          "description": "A list of performances.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/EventBooking/types/Performance"
          }
        },
        "Performance": {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9])$",
              "example": "2018-02-02"
            },
            "time": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "15:41"
            },
            "location": {
              "type": "string"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Seats": {
          "type": "array",
          "description": "A list of seats.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/EventBooking/types/Seat"
          }
        },
        "Seat": {
          "type": "object",
          "properties": {
            "number": {
              "type": "string",
              "minLength": 1,
              "example": "A10"
            },
            "section": {
              "type": "string",
              "minLength": 1,
              "example": "stalls"
            },
            "websiteId": {
              "type": "string",
              "description": "Unique identifier of the seat on the supplier's website, database id or html element id.",
              "minLength": 1,
              "example": "3ea307de-c69a-43c5-9d2e-63083ab3c945"
            },
            "sectionId": {
              "type": "string",
              "description": "Unique identifier of the seat section on the supplier's website, database id or html element id.",
              "minLength": 1,
              "example": "3ea307de-c69a-43c5-9d2e-63083ab3c945"
            },
            "ticketName": {
              "type": "string",
              "example": "Full price variety bundle"
            },
            "price": {
              "$ref": "#/domains/EventBooking/types/Price",
              "description": "Price, if found on the seat selection page."
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "SelectedItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            },
            {
              "type": "null"
            }
          ]
        },
        "Tickets": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "count": {
              "type": "integer",
              "minimum": 1,
              "description": "Count of tickets",
              "example": 2
            }
          },
          "required": [
            "count"
          ]
        },
        "StructuredTextItemsOrNull": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            }
          ]
        },
        "AccountPassword": {
          "type": "string",
          "pii": true
        },
        "Boolean": {
          "type": "boolean"
        },
        "Intent": {
          "type": "string",
          "enum": [
            "clearBasket"
          ]
        },
        "String": {
          "type": "string"
        },
        "Price": {
          "type": "object",
          "description": "Basic price information.",
          "properties": {
            "currencyCode": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "value": {
              "type": "integer",
              "description": "An integer in the smallest currency unit (100 for £1.00).",
              "example": "12300"
            },
            "tax": {
              "type": "integer",
              "example": "12"
            }
          },
          "required": [
            "currencyCode",
            "value"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "BasketCleared",
          "category": "client",
          "description": "Basket cleared upon request."
        },
        {
          "code": "DeliveryOptionInvalid",
          "category": "client",
          "description": "Delivery option does not match one of the options we are expecting"
        },
        {
          "code": "RefundOptionNotFound",
          "category": "client",
          "description": "Refund option does not match one of the options we are expecting"
        },
        {
          "code": "SeatSelectionNotAvailable",
          "category": "client",
          "description": "The seats are not available"
        },
        {
          "code": "EventNotAvailable",
          "category": "client",
          "description": "Requested event is not found"
        },
        {
          "code": "UpsellNotAvailable",
          "category": "client",
          "description": "Selected upsell item or quantity not available."
        }
      ]
    },
    "FlightBooking": {
      "description": "Allows automating airplane tickets booking on airline websites and OTAs.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "dataExtractionDomainId": "FlightBookingExtraction",
      "inputs": {
        "options": {
          "typeRef": "#/domains/FlightBooking/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "search": {
          "typeRef": "#/domains/FlightBooking/types/Search",
          "initial": true
        },
        "selectedOutboundFlight": {
          "typeRef": "#/domains/FlightBooking/types/Flight",
          "sourceOutputKey": "availableOutboundFlights",
          "inputMethod": "SelectOne"
        },
        "selectedInboundFlight": {
          "typeRef": "#/domains/FlightBooking/types/Flight",
          "sourceOutputKey": "availableInboundFlights",
          "inputMethod": "SelectOne"
        },
        "itinerary": {
          "typeRef": "#/domains/FlightBooking/types/Itinerary",
          "description": "Deprecated. See <a href=\"#search\">/search</a> and <a href=\"#selectedOutboundFlight\">/selectedOutboundFlight</a>.",
          "deprecated": true
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "accountVerification": {
          "typeRef": "#/domains/FlightBooking/types/VerificationString"
        },
        "addPriorityBoarding": {
          "typeRef": "#/domains/FlightBooking/types/AddPriorityBoarding"
        },
        "deviceVerification": {
          "typeRef": "#/domains/FlightBooking/types/VerificationString"
        },
        "passengers": {
          "typeRef": "#/domains/FlightBooking/types/Passengers",
          "canonical": [
            "/0/firstName",
            "/0/lastName",
            "/0/dateOfBirth"
          ]
        },
        "additionalLuggage": {
          "typeRef": "#/domains/FlightBooking/types/PassengersAdditionalLuggage",
          "description": "A list of additional luggage to be purchased per passenger. The cartinality of this array must match the one of passengers."
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "selectedOutboundFare": {
          "typeRef": "#/domains/FlightBooking/types/Fare",
          "description": "Requested when fare selection for outbound flight is required by website.<br/>At this point <code>availableOutboundFares</code> output should contain information about available fares.<br/>Note: on deep links with pre-selected flight this input is not required.<br/>Automation may fail if incorrect fare is specified, or if fare is no longer available.",
          "sourceOutputKey": "availableOutboundFares",
          "inputMethod": "SelectOne"
        },
        "selectedInboundFare": {
          "typeRef": "#/domains/FlightBooking/types/Fare",
          "description": "Requested when fare selection for inbound flight is required by website.<br/>At this point <code>availableInboundFares</code> output should contain information about available fares.<br/>Note: on deep links with pre-selected flight this input is not required.<br/>Automation may fail if incorrect fare is specified, or if fare is no longer available.",
          "sourceOutputKey": "availableInboundFares",
          "inputMethod": "SelectOne"
        },
        "selectedDynamicSeats": {
          "typeRef": "#/domains/FlightBooking/types/SelectedDynamicSeats",
          "dynamic": true
        },
        "voucher": {
          "typeRef": "#/domains/FlightBooking/types/Voucher",
          "description": "Discount voucher."
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided."
        },
        "cancelBooking": {
          "typeRef": "#/domains/FlightBooking/types/Boolean"
        }
      },
      "outputs": {
        "cookies": {
          "typeRef": "#/domains/Generic/types/Cookies"
        },
        "availableOutboundFlights": {
          "typeRef": "#/domains/FlightBooking/types/Flights"
        },
        "availableInboundFlights": {
          "typeRef": "#/domains/FlightBooking/types/Flights"
        },
        "availableOutboundFares": {
          "typeRef": "#/domains/FlightBooking/types/AvailableFares",
          "description": "Emitted when actual outbound fares information is collected.<br/>Note: on deep links with pre-selected flight this output will not be provided."
        },
        "availableInboundFares": {
          "typeRef": "#/domains/FlightBooking/types/AvailableFares",
          "description": "Emitted when actual inbound fares information is collected.<br/>Note: on deep links with pre-selected flight this output will not be provided."
        },
        "selectableLuggage": {
          "typeRef": "#/domains/FlightBooking/types/ListOfLuggageWithPrice",
          "description": "The luggage which can be selected for the passengers."
        },
        "availableDynamicSeats": {
          "typeRef": "#/domains/FlightBooking/types/AvailableDynamicSeats",
          "dynamic": true
        },
        "availableFrequentFlyerProgrammes": {
          "typeRef": "#/domains/FlightBooking/types/AvailableFrequentFlyerProgrammes",
          "description": "Where available, the list of frequent flyer programmes available on the website."
        },
        "fareRules": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when fare rules are presented."
        },
        "conditionsOfCarriage": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when conditions of carriage is presented."
        },
        "bookingTermsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when booking T&Cs are presented."
        },
        "privacyPolicy": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the privacy policy is presented."
        },
        "voucherDetails": {
          "typeRef": "#/domains/FlightBooking/types/VoucherDetails",
          "description": "Voucher details"
        },
        "estimatedPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Price shown by the website prior to requiring passenger information.<br/>On many flight booking websites, it is possible to view an estimated price without entering passenger details, provided that the deeplink works and goes past the home page, where the count of passengers and their ages are usually required. This estimated price is emitted when the automation reaches a page where passenger or billing information is required, as long as the price is displayed.<br/>This is likely not the final price, as flight ancilliaries may be added as requested, or additional credit card charges may be applied."
        },
        "priceBreakdown": {
          "typeRef": "#/domains/FlightBooking/types/PriceBreakdown",
          "description": "The list of price components, as found on the website."
        },
        "isPromoCodeApplied": {
          "typeRef": "#/domains/FlightBooking/types/Boolean"
        },
        "availablePriorityBoarding": {
          "typeRef": "#/domains/FlightBooking/types/AvailablePriorityBoarding"
        },
        "estimatedPriceBreakdown": {
          "typeRef": "#/domains/FlightBooking/types/PriceBreakdown",
          "description": "The list of estimated price components, as found on the website."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/FlightBooking/types/BookingConfirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features like seat selection. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "selectCheapestFare": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will select the cheapest fare without requesting or using selected*boundFare inputs.",
              "default": false
            },
            "voucher": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will request the voucher input before payment.",
              "default": false
            },
            "seatSelection": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will request <code>selectedSeats</code> for seat selection.",
              "default": false
            },
            "lhBookingRef": {
              "type": "string"
            },
            "clientReference": {
              "type": "string"
            },
            "priceCheck": {
              "type": "boolean",
              "default": false
            },
            "enableExperimentalPriorityBoarding": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "Itinerary": {
          "type": "object",
          "description": "Deprecated. See <a href=\"#Search\">Search</a> and <a href=\"#FlightSearch\">FlightSearch</a> instead.<br/>Information about flights and cabin class preference.",
          "deprecated": true,
          "properties": {
            "cabinClass": {
              "$ref": "#/domains/FlightBooking/types/CabinClass",
              "description": "Preferred cabin class, used on flight search forms."
            },
            "outbound": {
              "$ref": "#/domains/FlightBooking/types/Flight",
              "description": "Outbound flight specification."
            },
            "inbound": {
              "$ref": "#/domains/FlightBooking/types/Flight",
              "description": "Inbound (return) flight specification. If omitted, one-way flight booking flow is used."
            }
          },
          "required": [
            "cabinClass",
            "outbound"
          ],
          "additionalProperties": false
        },
        "AddPriorityBoarding": {
          "type": "object",
          "properties": {
            "outbound": {
              "$ref": "#/domains/FlightBooking/types/AddPriorityBoardingOptions"
            },
            "inbound": {
              "$ref": "#/domains/FlightBooking/types/AddPriorityBoardingOptions"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AddPriorityBoardingOptions": {
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBooking/types/AddPriorityBoardingOption"
          },
          "minItems": 1
        },
        "AddPriorityBoardingOption": {
          "type": "object",
          "properties": {
            "addPriority": {
              "type": "boolean"
            },
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AvailablePriorityBoarding": {
          "type": "object",
          "properties": {
            "outbound": {
              "$ref": "#/domains/FlightBooking/types/AvailablePriorityBoardingOptions"
            },
            "inbound": {
              "$ref": "#/domains/FlightBooking/types/AvailablePriorityBoardingOptions"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AvailablePriorityBoardingOptions": {
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBooking/types/AvailablePriorityBoardingOption"
          },
          "minItems": 1
        },
        "AvailablePriorityBoardingOption": {
          "type": "object",
          "properties": {
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Search": {
          "type": "object",
          "description": "Information about flights and cabin class preference.",
          "properties": {
            "cabinClass": {
              "$ref": "#/domains/FlightBooking/types/CabinClass",
              "description": "Preferred cabin class, used on flight search forms."
            },
            "outbound": {
              "$ref": "#/domains/FlightBooking/types/FlightSearch",
              "description": "Outbound flight specification."
            },
            "inbound": {
              "$ref": "#/domains/FlightBooking/types/FlightSearch",
              "description": "Inbound (return) flight specification. If omitted, one-way flight booking flow is used."
            },
            "passengerAges": {
              "$ref": "#/domains/Generic/types/Ages",
              "description": "Ages of all passengers.",
              "example": [
                34,
                31,
                9
              ]
            },
            "promoCode": {
              "type": "string"
            }
          },
          "required": [
            "cabinClass",
            "outbound",
            "passengerAges"
          ],
          "additionalProperties": false
        },
        "FlightSearch": {
          "type": "object",
          "description": "Outbound and inbound flights specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/FlightBooking/types/DateAirport"
            },
            "destination": {
              "$ref": "#/domains/FlightBooking/types/DateAirport"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "Flights": {
          "type": "array",
          "description": "An array with details for each flight.",
          "items": {
            "$ref": "#/domains/FlightBooking/types/Flight"
          },
          "minItems": 1
        },
        "Flight": {
          "type": "object",
          "description": "Outbound and inbound flights specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/FlightBooking/types/DateTimeAirport"
            },
            "destination": {
              "$ref": "#/domains/FlightBooking/types/DateTimeAirport"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "flightNumber": {
              "$ref": "#/domains/FlightBooking/types/ArrayOrString"
            },
            "segments": {
              "$ref": "#/domains/FlightBooking/types/Segments"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "Segments": {
          "type": "array",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/FlightBooking/types/Flight"
          }
        },
        "CabinClass": {
          "type": "string",
          "enum": [
            "economy",
            "premium economy",
            "business",
            "first"
          ]
        },
        "DateAirport": {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "format": "date",
              "description": "Date of flight (airport local date).",
              "example": "2019-01-01"
            },
            "airportCode": {
              "$ref": "#/domains/FlightBooking/types/AirportCode"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of airport.",
              "example": "us"
            }
          },
          "required": [
            "date",
            "airportCode"
          ],
          "additionalProperties": false
        },
        "DateTimeAirport": {
          "type": "object",
          "properties": {
            "dateTime": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "description": "Date and time of flight (airport local time).",
              "example": "2018-02-02 19:40"
            },
            "airportCode": {
              "$ref": "#/domains/FlightBooking/types/AirportCode"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of airport.",
              "example": "us"
            }
          },
          "required": [
            "dateTime",
            "airportCode"
          ],
          "additionalProperties": false
        },
        "AirportCode": {
          "type": "string",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "^[A-Z]{3}$",
          "description": "International Air Transport Association airport code.",
          "example": "SFO"
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/FlightBooking/types/Passenger"
          }
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            },
            "addAdditionalLuggage": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            },
            "frequentFlyer": {
              "$ref": "#/domains/FlightBooking/types/PassengerFrequentFlyer"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "PassengersAdditionalLuggage": {
          "type": "array",
          "description": "The cardinality of this array must match that of the passengers. A mismatch leads to the input being invalidated.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/domains/FlightBooking/types/LuggageWithWeight"
            }
          }
        },
        "AvailableFares": {
          "type": "array",
          "description": "A list of available fares found on the website.",
          "minItems": 1,
          "maxItems": 15,
          "items": {
            "$ref": "#/domains/FlightBooking/types/Fare"
          }
        },
        "Fare": {
          "type": "object",
          "description": "Flight fare information.",
          "additionalProperties": false,
          "properties": {
            "cabinClass": {
              "$ref": "#/domains/FlightBooking/types/CabinClass"
            },
            "fareName": {
              "type": "string",
              "description": "Fare marketing name as provided by airline.",
              "example": "Business Flex"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "services": {
              "type": "array",
              "items": {
                "$ref": "#/domains/Generic/types/StructuredTextItem"
              }
            },
            "luggage": {
              "type": "array",
              "description": "A list of luggage with price.",
              "items": {
                "$ref": "#/domains/FlightBooking/types/LuggageBasic"
              }
            }
          },
          "required": [
            "fareName",
            "cabinClass",
            "price"
          ]
        },
        "LuggageBasic": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "under-seat",
                "cabin",
                "checked"
              ],
              "example": "economy"
            },
            "count": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            },
            "weight": {
              "type": "string",
              "example": "10kg"
            },
            "size": {
              "type": "string",
              "example": "40cm x 20cm x 25cm"
            }
          },
          "required": [
            "type",
            "count"
          ]
        },
        "LuggageWithWeight": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "under-seat",
                "cabin",
                "checked"
              ],
              "example": "economy"
            },
            "count": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            },
            "weight": {
              "type": "string",
              "example": "10kg"
            },
            "size": {
              "type": "string",
              "example": "40cm x 20cm x 25cm"
            }
          },
          "required": [
            "type",
            "count",
            "weight"
          ]
        },
        "LuggageWithPrice": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "under-seat",
                "cabin",
                "checked"
              ],
              "example": "economy"
            },
            "weight": {
              "type": "string",
              "example": "10kg"
            },
            "size": {
              "type": "string",
              "example": "40cm x 20cm x 25cm"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Luggage price. This is the cost of luggage"
            },
            "maxPerPassenger": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            },
            "maxPerGroup": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            }
          },
          "required": [
            "type",
            "price",
            "weight"
          ]
        },
        "ListOfLuggageWithWeight": {
          "type": "array",
          "description": "A list of luggage with weight.",
          "items": {
            "$ref": "#/domains/FlightBooking/types/LuggageWithWeight"
          }
        },
        "ListOfLuggageWithPrice": {
          "type": "array",
          "description": "A list of luggage with price.",
          "items": {
            "$ref": "#/domains/FlightBooking/types/LuggageWithPrice"
          }
        },
        "SelectedDynamicSeats": {
          "type": "array",
          "description": "The cardinality of this array must match that of the passengers. A mismatch leads to the input being invalidated.",
          "items": {
            "items": {
              "name": "#/domains/FlightBooking/types/SeatNumber"
            }
          }
        },
        "AvailableDynamicSeats": {
          "type": "object",
          "description": "Seat availability mapping.",
          "properties": {
            "segment": {
              "items": {
                "$ref": "#/domains/FlightBooking/types/Segment"
              }
            },
            "map": {
              "items": {
                "$ref": "#/domains/FlightBooking/types/Map"
              }
            }
          },
          "required": [
            "segment",
            "map"
          ],
          "additionalProperties": false
        },
        "Map": {
          "type": "object",
          "description": "A map of the aircraft layout and cabin class.",
          "properties": {
            "cabinClass": {
              "$ref": "#/domains/FlightBooking/types/CabinClass",
              "description": "Preferred cabin class, used on flight search forms."
            },
            "layout": {
              "$ref": "#/domains/FlightBooking/types/Layout",
              "description": "Seat layout.",
              "example": "Kitchener-Waterloo"
            }
          },
          "additionalProperties": false,
          "required": [
            "cabinClass",
            "layout"
          ]
        },
        "Layout": {
          "type": "object",
          "description": "Flight map seat layout.",
          "properties": {
            "columns": {
              "$ref": "#/domains/FlightBooking/types/Columns"
            },
            "rows": {
              "$ref": "#/domains/FlightBooking/types/Rows"
            }
          },
          "additionalProperties": false,
          "required": [
            "columns",
            "rows"
          ]
        },
        "Columns": {
          "type": "array",
          "description": "An array of columns letters and position.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "name": "#/domains/FlightBooking/types/Column"
            }
          }
        },
        "Column": {
          "type": "object",
          "properties": {
            "value": {
              "type": "string",
              "description": "Column letter.",
              "example": "A"
            },
            "position": {
              "type": "string",
              "description": "Position of the seat in the row.",
              "enum": [
                "window",
                "middle",
                "aisle"
              ],
              "example": "aisle"
            }
          },
          "additionalProperties": false,
          "required": [
            "value",
            "position"
          ]
        },
        "Segment": {
          "type": "object",
          "description": "Flight segment that corresponds with the current seat map.",
          "properties": {
            "from": {
              "type": "string",
              "description": "Origin airport name grabbed from the page.",
              "example": "Deer Lake"
            },
            "to": {
              "type": "string",
              "description": "Destination airport name grabbed from the page.",
              "example": "Kitchener-Waterloo"
            }
          },
          "additionalProperties": false,
          "required": [
            "from",
            "to"
          ]
        },
        "SeatNumber": {
          "type": "object",
          "description": "Seat number as extracted from website.",
          "properties": {
            "number": {
              "type": "string",
              "description": "Seat Number.",
              "example": "7A"
            }
          },
          "additionalProperties": false,
          "required": [
            "number"
          ]
        },
        "Rows": {
          "type": "array",
          "description": "An array of cabin rows.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "name": "#/domains/FlightBooking/types/Row"
            }
          }
        },
        "Row": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "number": {
              "type": "integer",
              "description": "Row Number.",
              "example": "5"
            },
            "seats": {
              "$ref": "#/domains/FlightBooking/types/Seats"
            }
          },
          "additionalProperties": false,
          "required": [
            "number",
            "seats"
          ]
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "Seats": {
          "type": "array",
          "description": "An array of seats.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "name": "#/domains/FlightBooking/types/Seat"
            }
          }
        },
        "Seat": {
          "type": "object",
          "description": "Seat metadata.",
          "properties": {
            "column": {
              "type": "string",
              "description": "Column letter.",
              "example": "B"
            },
            "number": {
              "$ref": "#/domains/FlightBooking/types/SeatNumber"
            },
            "isAvailable": {
              "type": "boolean",
              "description": "<code>true</code> if website allows selecting this seat, <code>false</code> otherwise."
            },
            "isRestricted": {
              "type": "boolean",
              "description": "<code>true</code> if seat has restrictions for certain groups of passengers."
            },
            "seatCharacteristics": {
              "$ref": "#/domains/FlightBooking/types/SeatCharacteristics"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Seat price, if such information is available."
            }
          },
          "required": [
            "column",
            "number",
            "isAvailable"
          ],
          "additionalProperties": false
        },
        "SeatCharacteristics": {
          "type": "array",
          "description": "An array of seat particularities.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "name": "#/domains/FlightBooking/types/SeatCharacteristic"
            }
          }
        },
        "SeatCharacteristic": {
          "type": "string",
          "example": "extra-legroom"
        },
        "PriceBreakdown": {
          "type": "array",
          "description": "The list of price components, as found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/FlightBooking/types/PriceBreakdownItem"
          }
        },
        "PriceBreakdownItem": {
          "type": "object",
          "description": "A component of the price breakdown.",
          "properties": {
            "text": {
              "type": "string",
              "description": "The description of an item on the price breakdown list, as found on the website.",
              "example": "Credit card charge"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "text",
            "price"
          ]
        },
        "PassengerFrequentFlyer": {
          "type": "object",
          "description": "Frequent flyer identification information",
          "properties": {
            "number": {
              "type": "string",
              "description": "Frequent flyer number",
              "example": "abc123456789"
            },
            "airlineName": {
              "type": "string",
              "description": "Complete English name of the airline",
              "example": "British Airways"
            },
            "programName": {
              "type": "string",
              "description": "Branding name of the frequent flyer programme, as defined by the airline",
              "example": "Avios Travel Rewards Programme"
            }
          },
          "required": [
            "number"
          ]
        },
        "AvailableFrequentFlyerProgrammes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "example": [
            "Miles & More",
            "Frequent Flyer Points Plus"
          ]
        },
        "Voucher": {
          "type": "object",
          "properties": {
            "number": {
              "type": "string",
              "description": "Voucher number",
              "example": "abc123456789"
            }
          },
          "required": [
            "number"
          ],
          "additionalProperties": false
        },
        "VoucherDetails": {
          "type": "object",
          "properties": {
            "overallValue": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Total amount the voucher is worth."
            },
            "deductedValue": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Amount the voucher deducts from the price."
            }
          },
          "required": [
            "deductedValue"
          ],
          "additionalProperties": false
        },
        "VerificationString": {
          "type": "string",
          "description": "Account verification challenge, usually a code or a link.",
          "example": "ABC123"
        },
        "Strings": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/FlightBooking/types/String"
          }
        },
        "String": {
          "type": "string"
        },
        "ArrayOrString": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/domains/FlightBooking/types/String"
              },
              "minItems": 1
            }
          ]
        },
        "Boolean": {
          "type": "boolean",
          "example": false
        }
      },
      "errors": [
        {
          "code": "PassengerDetailsInvalid",
          "category": "client",
          "description": "Passenger details invalid"
        },
        {
          "code": "OutboundFlightDateInvalid",
          "category": "client",
          "description": "Outbound flight date is not accepted by the website",
          "example": "Selected date is too close"
        },
        {
          "code": "InboundFlightDateInvalid",
          "category": "client",
          "description": "Inbound flight date is not accepted by the website",
          "example": "Selected date is too close"
        },
        {
          "code": "DateOfBirthInvalid",
          "category": "client",
          "description": "Date of birth is not accepted by the website",
          "example": "Child must be younger than 12"
        },
        {
          "code": "DocumentIssueDateInvalid",
          "category": "client",
          "description": "Document issue date is not accepted by the website",
          "example": "The issue date cannot be after today's date"
        },
        {
          "code": "DocumentExpiryDateInvalid",
          "category": "client",
          "description": "Document expiration date is not accepted by the website",
          "example": "Document should be valid for more than 3 months"
        },
        {
          "code": "OutboundFlightNotAvailable",
          "category": "client",
          "description": "Outbound flight is not found",
          "example": "Flight is not available on given date"
        },
        {
          "code": "InboundFlightNotAvailable",
          "category": "client",
          "description": "Inbound flight is not found",
          "example": "Flight is not available on given date"
        },
        {
          "code": "OriginAirportNotFound",
          "category": "client",
          "description": "Airport is not found with given airport code"
        },
        {
          "code": "DestinationAirportNotFound",
          "category": "client",
          "description": "Airport is not found with given airport code"
        },
        {
          "code": "CabinClassNotFound",
          "category": "client",
          "description": "Given cabin class is not found on the website"
        },
        {
          "code": "OutboundFareNotFound",
          "category": "client",
          "description": "Given outbound fare does not match one of the options we are expecting"
        },
        {
          "code": "InboundFareNotFound",
          "category": "client",
          "description": "Given inbound fare does not match one of the options we are expecting"
        },
        {
          "code": "SeatNotFound",
          "category": "client",
          "description": "Given seat does not match one of the options we are expecting"
        },
        {
          "code": "SeatSelectionNotAvailable",
          "category": "client",
          "description": "Client asked for seat selection but it's not available for the website"
        },
        {
          "code": "LoadingFailed",
          "category": "client",
          "description": "A website issue in which the page gets stuck in infinite loading."
        },
        {
          "code": "PaymentFailed",
          "category": "client",
          "description": "A website or other issue in which the success page cannot be reached after payment stage."
        },
        {
          "code": "LuggageCannotBeAdded",
          "category": "client",
          "description": "Luggage cannot be added",
          "example": "Cannot add an additional luggage for selected fare."
        },
        {
          "code": "PassengerDocumentRequired",
          "category": "client",
          "description": "Passenger document (passport or other travel document) is required by the website"
        },
        {
          "code": "NationalityRequired",
          "category": "client",
          "description": "Nationality country is required by the website"
        },
        {
          "code": "DuplicateBooking",
          "category": "client",
          "description": "The website claims this is a duplicate booking attempt."
        },
        {
          "code": "VoucherDetailsInvalid",
          "category": "client",
          "description": "The website claims this voucher's details are not valid (number or name mismatch)."
        },
        {
          "code": "PromoCodeInvalid",
          "category": "client",
          "description": "The promo code you entered is not valid or mistyped."
        },
        {
          "code": "PaymentCardRequiredAtAirport",
          "category": "client",
          "description": "Payment card is required to be presented at airport."
        },
        {
          "code": "PriceCheck",
          "category": "client",
          "description": "This was a price check, not a booking attempt."
        }
      ]
    },
    "FlightBookingExtraction": {
      "description": "Internal domain for generating FlightBooking inputs.",
      "private": true,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL"
        },
        "options": {
          "typeRef": "#/domains/FlightBooking/types/Options",
          "default": {},
          "initial": true
        },
        "selectedOriginAirportCode": {
          "typeRef": "#/domains/FlightBooking/types/AirportCode",
          "sourceOutputKey": "availableOriginAirportCodes",
          "inputMethod": "SelectOne"
        },
        "selectedDestinationAirportCode": {
          "typeRef": "#/domains/FlightBooking/types/AirportCode",
          "sourceOutputKey": "availableDestinationAirportCodes",
          "inputMethod": "SelectOne"
        },
        "outboundMonthYear": {
          "typeRef": "#/domains/FlightBookingExtraction/types/MonthYear"
        },
        "inboundMonthYear": {
          "typeRef": "#/domains/FlightBookingExtraction/types/MonthYearOrNull"
        },
        "selectedOutboundDay": {
          "typeRef": "#/domains/FlightBookingExtraction/types/Day",
          "sourceOutputKey": "availableOutboundDays",
          "inputMethod": "SelectOne"
        },
        "selectedInboundDay": {
          "typeRef": "#/domains/FlightBookingExtraction/types/Day",
          "sourceOutputKey": "availableInboundDays",
          "inputMethod": "SelectOne"
        },
        "passengerAges": {
          "typeRef": "#/domains/Generic/types/Ages"
        }
      },
      "outputs": {
        "availableOriginAirportCodes": {
          "typeRef": "#/domains/FlightBookingExtraction/types/AirportCodes"
        },
        "availableDestinationAirportCodes": {
          "typeRef": "#/domains/FlightBookingExtraction/types/AirportCodes"
        },
        "availableOutboundDays": {
          "typeRef": "#/domains/FlightBookingExtraction/types/Days"
        },
        "availableInboundDays": {
          "typeRef": "#/domains/FlightBookingExtraction/types/Days"
        },
        "search": {
          "typeRef": "#/domains/FlightBooking/types/Search"
        },
        "selectedOutboundFlight": {
          "typeRef": "#/domains/FlightBooking/types/Flight"
        },
        "selectedInboundFlight": {
          "typeRef": "#/domains/FlightBooking/types/Flight"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "additionalProperties": false
        },
        "AirportCodes": {
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBooking/types/AirportCode"
          }
        },
        "Days": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "MonthYear": {
          "type": "string",
          "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])"
        },
        "MonthYearOrNull": {
          "oneOf": [
            {
              "$ref": "#/domains/FlightBookingExtraction/types/MonthYear"
            },
            {
              "type": "null"
            }
          ]
        },
        "Day": {
          "type": "string",
          "pattern": "\\d{1,2}"
        }
      },
      "errors": []
    },
    "FlightBookingManagement": {
      "description": "Allows automating airplane tickets booking on airline websites and OTAs.",
      "private": false,
      "inputs": {
        "options": {
          "typeRef": "#/domains/FlightBookingManagement/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "passengers": {
          "typeRef": "#/domains/FlightBookingManagement/types/Passengers",
          "canonical": [
            "/0/firstName",
            "/0/lastName",
            "/0/dateOfBirth"
          ]
        },
        "payment": {
          "typeRef": "#/domains/FlightBookingManagement/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/FlightBookingManagement/types/BookingConfirmation"
        },
        "additionalLuggage": {
          "typeRef": "#/domains/FlightBookingManagement/types/PassengersAdditionalLuggage",
          "description": "A list of additional luggage to be purchased per passenger. The cartinality of this array must match the one of passengers."
        },
        "selectedSeats": {
          "typeRef": "#/domains/FlightBookingManagement/types/SeatsWithLegs"
        },
        "expectedPrice": {
          "description": "Used to check the final price",
          "typeRef": "#/domains/Generic/types/Price"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided."
        }
      },
      "outputs": {
        "availableSeats": {
          "typeRef": "#/domains/FlightBookingManagement/types/SeatsWithLegs"
        },
        "includedLuggage": {
          "typeRef": "#/domains/FlightBookingManagement/types/IncludedLuggage"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "selectableLuggage": {
          "typeRef": "#/domains/FlightBookingManagement/types/ListOfLuggageWithPrice",
          "description": "The luggage which can be selected for the passengers."
        },
        "confirmation": {
          "typeRef": "#/domains/FlightBookingManagement/types/Confirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features like seat selection. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "luggageSelection": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will select additional luggage.",
              "default": false
            },
            "seatSelection": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will request <code>selectedSeats</code> for seat selection.",
              "default": false
            }
          }
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/FlightBookingManagement/types/Passenger"
          }
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "ageGroup": {
              "enum": [
                "adult",
                "child",
                "infant",
                "infantOnLap"
              ]
            },
            "addAdditionalLuggage": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3,
              "default": 0
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            },
            "frequentFlyer": {
              "$ref": "#/domains/FlightBookingManagement/types/PassengerFrequentFlyer"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "PassengerFrequentFlyer": {
          "type": "object",
          "description": "Frequent flyer identification information",
          "properties": {
            "number": {
              "type": "string",
              "description": "Frequent flyer number",
              "example": "abc123456789"
            },
            "airlineName": {
              "type": "string",
              "description": "Complete English name of the airline",
              "example": "British Airways"
            },
            "programName": {
              "type": "string",
              "description": "Branding name of the frequent flyer programme, as defined by the airline",
              "example": "Avios Travel Rewards Programme"
            }
          },
          "required": [
            "number"
          ]
        },
        "IncludedLuggage": {
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBookingManagement/types/IncludedLuggageItem"
          }
        },
        "IncludedLuggageItem": {
          "type": "object",
          "properties": {
            "count": {
              "type": "integer",
              "example": 2
            },
            "weightCategory": {
              "type": "string",
              "example": "20kg"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "PassengersAdditionalLuggage": {
          "type": "array",
          "description": "The cardinality of this array must match that of the passengers. A mismatch leads to the input being invalidated.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/domains/FlightBookingManagement/types/LuggageWithWeight"
            }
          }
        },
        "LuggageWithWeight": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "under-seat",
                "cabin",
                "checked"
              ],
              "example": "economy"
            },
            "count": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            },
            "weight": {
              "type": "string",
              "example": "10kg"
            },
            "size": {
              "type": "string",
              "example": "40cm x 20cm x 25cm"
            }
          },
          "required": [
            "type",
            "count",
            "weight"
          ]
        },
        "ListOfLuggageWithPrice": {
          "type": "array",
          "description": "A list of luggage with price.",
          "items": {
            "$ref": "#/domains/FlightBookingManagement/types/LuggageWithPrice"
          }
        },
        "LuggageWithPrice": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "under-seat",
                "cabin",
                "checked"
              ],
              "example": "economy"
            },
            "weight": {
              "type": "string",
              "example": "10kg"
            },
            "size": {
              "type": "string",
              "example": "40cm x 20cm x 25cm"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Luggage price. This is the cost of luggage"
            },
            "maxPerPassenger": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            },
            "maxPerGroup": {
              "type": "number",
              "minimum": 1,
              "maximum": 20,
              "example": 1
            }
          },
          "required": [
            "type",
            "price",
            "weight"
          ]
        },
        "AvailableSeatsLeg": {
          "type": "object",
          "properties": {
            "leg": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "string"
                },
                "to": {
                  "type": "string"
                },
                "airline": {
                  "type": "string"
                },
                "flightNumber": {
                  "type": "string"
                }
              },
              "description": "Flight leg."
            },
            "seats": {
              "type": "array",
              "items": {
                "$ref": "#/domains/FlightBookingManagement/types/Seat"
              }
            }
          },
          "required": [
            "leg",
            "seats"
          ],
          "additionalProperties": false
        },
        "SeatsWithLegs": {
          "description": "Seat availability information for each leg.",
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBookingManagement/types/AvailableSeatsLeg"
          }
        },
        "BookingConfirmation": {
          "pii": true,
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "firstName": {
              "type": "string",
              "description": "First name, as specified in passport or travel document.",
              "example": "Smith"
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "originAirport": {
              "type": "string",
              "description": "Departure airport.",
              "example": "JFK"
            },
            "email": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "Seat": {
          "type": "object",
          "description": "Seat metadata.",
          "properties": {
            "seatNumber": {
              "$ref": "#/domains/FlightBookingManagement/types/SeatNumber"
            },
            "available": {
              "type": "boolean",
              "description": "<code>true</code> if website allows selecting this seat, <code>false</code> otherwise."
            },
            "restricted": {
              "type": "boolean",
              "description": "<code>true</code> if seat has restrictions for certain groups of passengers."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Seat price, if such information is available."
            }
          },
          "required": [
            "seatNumber",
            "available"
          ],
          "additionalProperties": false
        },
        "SeatNumber": {
          "type": "string",
          "description": "Seat number as extracted from website.",
          "example": "7A"
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/FlightBookingManagement/types/Person"
            },
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "tax": {
              "$ref": "#/domains/Generic/types/Tax"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on the \"success\" page.",
          "properties": {
            "message": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "message"
          ]
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        }
      ]
    },
    "FlightBookingRefund": {
      "description": "Allows automating flight refunds.",
      "private": false,
      "inputs": {
        "flight": {
          "typeRef": "#/domains/FlightBookingRefund/types/Flight"
        },
        "contact": {
          "typeRef": "#/domains/FlightBookingRefund/types/Contact"
        },
        "passengers": {
          "typeRef": "#/domains/FlightBookingRefund/types/Passengers"
        }
      },
      "outputs": {},
      "types": {
        "Flight": {
          "type": "object",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Flight booking reference.",
              "example": "RL2XYZ"
            },
            "number": {
              "type": "string"
            },
            "isReturn": {
              "type": "boolean"
            },
            "date": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9])",
              "description": "Date of flight (airport local time).",
              "example": "2021-02-22"
            }
          },
          "required": [
            "bookingReference",
            "number",
            "isReturn",
            "date"
          ],
          "additionalProperties": false
        },
        "Contact": {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            },
            "email": {
              "type": "string",
              "description": "Booking email address.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [
            "email"
          ],
          "additionalProperties": false
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "lastName": {
              "type": "string",
              "description": "Last name(s) or family name(s), as specified in passport or travel document.",
              "example": "Bobson"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "maxItems": 20,
          "items": {
            "$ref": "#/domains/FlightBookingRefund/types/Passenger"
          }
        }
      },
      "errors": [
        {
          "code": "RefundAlreadyRequested",
          "category": "client",
          "description": "A refund has already been requested for this booking."
        },
        {
          "code": "FlightDetailsInvalid",
          "category": "client",
          "description": "The flight details provided are invalid."
        },
        {
          "code": "RefundRequestFailed",
          "category": "website",
          "description": "The refund request has failed."
        }
      ]
    },
    "FlightBookingStatus": {
      "description": "Allows automating flight status retrieval.",
      "private": false,
      "inputs": {
        "bookingConfirmation": {
          "typeRef": "#/domains/FlightBookingStatus/types/BookingConfirmation"
        }
      },
      "outputs": {
        "inboundDateTime": {
          "typeRef": "#/domains/FlightBookingStatus/types/FlightDateTime"
        },
        "outboundDateTime": {
          "typeRef": "#/domains/FlightBookingStatus/types/FlightDateTime"
        },
        "inboundFlightNumber": {
          "typeRef": "#/domains/FlightBookingStatus/types/FlightNumber"
        },
        "outboundFlightNumber": {
          "typeRef": "#/domains/FlightBookingStatus/types/FlightNumber"
        },
        "outboundStatus": {
          "typeRef": "#/domains/FlightBookingStatus/types/Status"
        },
        "inboundStatus": {
          "typeRef": "#/domains/FlightBookingStatus/types/Status"
        }
      },
      "types": {
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "email": {
              "type": "string",
              "description": "Email the booking confirmation was sent to.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference",
            "email"
          ]
        },
        "FlightDateTime": {
          "type": "object",
          "properties": {
            "departure": {
              "$ref": "#/domains/FlightBookingStatus/types/DateTime"
            },
            "arrival": {
              "$ref": "#/domains/FlightBookingStatus/types/DateTime"
            }
          },
          "required": [
            "departure",
            "arrival"
          ],
          "additionalProperties": false
        },
        "DateTime": {
          "type": "string",
          "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
          "description": "Date and time of flight (airport local time).",
          "example": "2021-02-02 19:40"
        },
        "FlightNumber": {
          "type": "string",
          "description": "Flight number.",
          "example": "ABC 1234"
        },
        "Status": {
          "type": "string",
          "description": "Flight booking status, as shown by the website"
        }
      },
      "errors": [
        {
          "code": "CustomerVerificationRequired",
          "category": "client",
          "description": "The website requires customer verification."
        }
      ]
    },
    "FlightBookingAccountSignup": {
      "description": "Allows automating account creation on airline websites and OTAs.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "accountDetails": {
          "typeRef": "#/domains/FlightBookingAccountSignup/types/AccountDetails"
        }
      },
      "outputs": {},
      "types": {
        "AccountDetails": {
          "type": "object",
          "pii": true,
          "description": "Required details for account creation.",
          "properties": {
            "person": {
              "$ref": "#/domains/FlightBookingAccountSignup/types/Person"
            },
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            }
          },
          "required": [
            "person",
            "email",
            "password"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The customer already has an account with this provider."
        }
      ]
    },
    "FlightBookingScraper": {
      "description": "Allows scraping automation on airline websites and OTAs.",
      "private": true,
      "inputs": {
        "options": {
          "typeRef": "#/domains/FlightBookingScraper/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "search": {
          "typeRef": "#/domains/FlightBookingScraper/types/Search",
          "initial": true
        },
        "country": {
          "typeRef": "#/domains/Generic/types/CountryCode",
          "initial": true
        }
      },
      "outputs": {
        "results": {
          "typeRef": "#/domains/FlightBookingScraper/types/Results"
        },
        "csv": {
          "typeRef": "#/domains/FlightBookingScraper/types/Csv"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features like seat selection. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {}
        },
        "Search": {
          "type": "object",
          "description": "Information about flights and cabin class preference.",
          "properties": {
            "cabinClass": {
              "$ref": "#/domains/FlightBookingScraper/types/CabinClass",
              "description": "Preferred cabin class, used on flight search forms."
            },
            "outbound": {
              "$ref": "#/domains/FlightBookingScraper/types/FlightSearch",
              "description": "Outbound flight specification."
            },
            "inbound": {
              "$ref": "#/domains/FlightBookingScraper/types/FlightSearch",
              "description": "Inbound (return) flight specification. If omitted, one-way flight booking flow is used."
            },
            "passengerAges": {
              "$ref": "#/domains/Generic/types/Ages",
              "description": "Ages of all passengers.",
              "example": [
                34,
                31,
                9
              ]
            },
            "promoCode": {
              "type": "string"
            }
          },
          "required": [
            "cabinClass",
            "outbound",
            "passengerAges"
          ],
          "additionalProperties": false
        },
        "FlightSearch": {
          "type": "object",
          "description": "Outbound and inbound flights specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/FlightBookingScraper/types/DateAirport"
            },
            "destination": {
              "$ref": "#/domains/FlightBookingScraper/types/DateAirport"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "CabinClass": {
          "type": "string",
          "enum": [
            "economy",
            "premium economy",
            "business",
            "first"
          ]
        },
        "DateAirport": {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "format": "date",
              "description": "Date of flight (airport local date).",
              "example": "2019-01-01"
            },
            "airportCode": {
              "$ref": "#/domains/FlightBookingScraper/types/AirportCode"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of airport.",
              "example": "us"
            }
          },
          "required": [
            "date",
            "airportCode"
          ],
          "additionalProperties": false
        },
        "AirportCode": {
          "type": "string",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "^[A-Z]{3}$",
          "description": "International Air Transport Association airport code.",
          "example": "SFO"
        },
        "Results": {
          "type": "array",
          "items": {
            "$ref": "#/domains/FlightBookingScraper/types/Result"
          },
          "minItems": 1
        },
        "Result": {
          "type": "object",
          "properties": {
            "site": {
              "type": "string"
            },
            "market": {
              "type": "string"
            },
            "outbound_date": {
              "type": "string"
            },
            "inbound_date": {
              "type": "string"
            },
            "outbound_city": {
              "type": "string"
            },
            "inbound_city": {
              "type": "string"
            },
            "outbound_flight_number": {
              "type": "string"
            },
            "inbound_flight_number": {
              "type": "string"
            },
            "outbound_airport": {
              "type": "string"
            },
            "inbound_airport": {
              "type": "string"
            },
            "outbound_airline": {
              "type": "string"
            },
            "inbound_airline": {
              "type": "string"
            },
            "supplier": {
              "type": "string"
            },
            "price": {
              "type": "integer"
            },
            "currency": {
              "type": "string"
            },
            "booking_class": {
              "type": "string"
            },
            "outbound_class": {
              "type": "string"
            },
            "inbound_class": {
              "type": "string"
            },
            "outbound_stops": {
              "type": "integer"
            },
            "inbound_stops": {
              "type": "integer"
            },
            "outbound_departure_time": {
              "type": "string"
            },
            "inbound_departure_time": {
              "type": "string"
            },
            "outbound_duration": {
              "type": "string"
            },
            "inbound_duration": {
              "type": "string"
            },
            "sort_order": {
              "type": "string"
            },
            "search_date": {
              "type": "string"
            },
            "search_timestamp": {
              "type": "string"
            },
            "snapshot_link": {
              "type": "string"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Csv": {
          "type": "string"
        }
      },
      "errors": [
        {
          "code": "OutboundFlightDateInvalid",
          "category": "client",
          "description": "Outbound flight date is not accepted by the website",
          "example": "Selected date is too close"
        },
        {
          "code": "InboundFlightDateInvalid",
          "category": "client",
          "description": "Inbound flight date is not accepted by the website",
          "example": "Selected date is too close"
        },
        {
          "code": "OutboundFlightNotAvailable",
          "category": "client",
          "description": "Outbound flight is not found",
          "example": "Flight is not available on given date"
        },
        {
          "code": "InboundFlightNotAvailable",
          "category": "client",
          "description": "Inbound flight is not found",
          "example": "Flight is not available on given date"
        },
        {
          "code": "OriginAirportNotFound",
          "category": "client",
          "description": "Airport is not found with given airport code"
        },
        {
          "code": "DestinationAirportNotFound",
          "category": "client",
          "description": "Airport is not found with given airport code"
        },
        {
          "code": "LoadingFailed",
          "category": "client",
          "description": "A website issue in which the page gets stuck in infinite loading."
        },
        {
          "code": "DuplicateBooking",
          "category": "client",
          "description": "The website claims this is a duplicate booking attempt."
        },
        {
          "code": "PromoCodeInvalid",
          "category": "client",
          "description": "The promo code you entered is not valid or mistyped."
        }
      ]
    },
    "Generic": {
      "description": "Generic domain contains type definitions used in other domains.",
      "private": false,
      "inputs": {},
      "outputs": {},
      "types": {
        "Event": {
          "type": "object",
          "description": "An object describing an specific event emitted by automation job. The exact event types and data depend on the specific service.",
          "required": [
            "type"
          ],
          "properties": {
            "type": {
              "type": "string",
              "description": "Event type, specific to an automation service."
            }
          },
          "additionalProperties": true
        },
        "Ages": {
          "type": "array",
          "description": "A list of ages of persons.",
          "items": {
            "type": "number",
            "minimum": 0,
            "maximum": 200,
            "example": 42
          }
        },
        "URL": {
          "type": "string",
          "format": "url",
          "description": "URL Record, as defined by <a href=\"https://url.spec.whatwg.org/#concept-url\" target=\"_blank\" rel=\"noopener\">WHATWG URL Standard</a>.",
          "example": "http://example.com"
        },
        "Cookies": {
          "type": "array",
          "description": "An array of cookie definitions.",
          "items": {
            "$ref": "#/domains/Generic/types/Cookie"
          }
        },
        "Cookie": {
          "type": "object",
          "description": "An object which defines a cookie. It must either contain a URL or a domain, alongisde name and value. For more information on the fields of this object, see <a href=\"https://tools.ietf.org/html/rfc6265#section-5.2\" target=\"_blank\" rel=\"noopener\">RFC 6265 section 5.2</a>.",
          "properties": {
            "name": {
              "type": "string",
              "description": "Cookie name."
            },
            "value": {
              "type": "string",
              "description": "Cookie value."
            },
            "url": {
              "type": "string",
              "format": "url",
              "description": "The URL from which the cookie is set."
            },
            "domain": {
              "type": "string",
              "description": "Cookie domain."
            },
            "path": {
              "type": "string",
              "description": "Cookie path."
            },
            "secure": {
              "type": "boolean",
              "description": "True if cookie is secure."
            },
            "session": {
              "type": "boolean",
              "description": "True if cookie is a session cookie."
            },
            "priority": {
              "type": "string",
              "description": "Cookie priority."
            },
            "httpOnly": {
              "type": "boolean",
              "description": "True if cookie is http-only."
            },
            "sameSite": {
              "type": "string",
              "description": "Cookie same-site type."
            },
            "expires": {
              "type": "number",
              "description": "Expiration date in seconds since the epoch (January 1, 1970 UTC)."
            },
            "size": {
              "type": "number",
              "description": "Size of the cookie."
            }
          },
          "required": [
            "name",
            "value"
          ],
          "additionalProperties": true
        },
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [
            "email",
            "isExisting"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number",
            "expirationDate",
            "issueCountryCode"
          ],
          "additionalProperties": false
        },
        "ExplicitAddress": {
          "type": "object",
          "description": "Explicit address components (parsed version, used to format into various standards).",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Name of the street.",
              "minLength": 1,
              "example": "Clerkenwell Close"
            },
            "streetNumber": {
              "type": "string",
              "description": "Number of the street or other building identifier, such as house number or house name",
              "minLength": 1,
              "example": "27-31"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "minLength": 1,
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [
            "streetName",
            "city",
            "postcode",
            "countryCode",
            "countrySubdivision"
          ],
          "additionalProperties": false
        },
        "InlinedAddress": {
          "type": "object",
          "description": "Address components common to inlined addresses (line1, line2)",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "minLength": 1,
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [
            "line1",
            "city",
            "postcode",
            "countryCode",
            "countrySubdivision"
          ],
          "additionalProperties": false
        },
        "Address": {
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            },
            {
              "$ref": "#/domains/Generic/types/InlinedAddress"
            }
          ]
        },
        "Phone": {
          "type": "object",
          "description": "Phone information, typically used on contact details pages.",
          "pii": true,
          "properties": {
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "number": {
              "type": "string",
              "minLength": 6,
              "description": "Mobile phone number (numbers only, excluding country code).",
              "example": "123456789"
            }
          },
          "required": [
            "countryCode",
            "number"
          ],
          "additionalProperties": false
        },
        "PriceConsent": {
          "type": "object",
          "description": "Price consent object used in final price confirmation flow.<br/>When automation reaches final price (typically happens immediately before placing the order) it will emit <code>finalPrice</code> object in output and will wait for consent from you. You then need to provide the exact copy of this object as <code>finalPriceConsent</code> input.",
          "properties": {
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "price"
          ]
        },
        "Price": {
          "type": "object",
          "description": "Basic price information.",
          "properties": {
            "currencyCode": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "value": {
              "type": "integer",
              "description": "An integer in the smallest currency unit (100 for £1.00).",
              "example": "12300"
            }
          },
          "required": [
            "currencyCode",
            "value"
          ],
          "additionalProperties": false
        },
        "PriceRange": {
          "type": "object",
          "description": "Price range information.",
          "properties": {
            "currencyCode": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "min": {
              "type": "integer",
              "description": "An integer in the smallest currency unit (100 for £1.00).",
              "example": "12000"
            },
            "max": {
              "type": "integer",
              "description": "An integer in the smallest currency unit (100 for £1.00).",
              "example": "12300"
            }
          },
          "required": [
            "currencyCode",
            "min",
            "max"
          ],
          "additionalProperties": false
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "tax": {
              "$ref": "#/domains/Generic/types/Tax"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "Tax": {
          "type": "object",
          "description": "Tax information.",
          "pii": true,
          "properties": {
            "number": {
              "type": "string",
              "description": "Local tax number.",
              "example": "RO37866619"
            }
          },
          "required": [
            "number"
          ],
          "additionalProperties": false
        },
        "PaymentCard": {
          "type": "object",
          "description": "Payment information for card payment. Note: card number should not be submitted in plain text as per PCI DSS. Use <code>panToken</code> to provide it securely instead.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Card type, debit or credit.",
              "enum": [
                "debit",
                "credit"
              ]
            },
            "holderType": {
              "type": "string",
              "description": "Card's holder type, personal or corporate.",
              "enum": [
                "personal",
                "corporate"
              ],
              "default": "corporate"
            },
            "brand": {
              "type": "string",
              "description": "Card brand, must be one of the supported card brands. Automation may fail if a specific card brand is not supported on a particular website.",
              "enum": [
                "visa",
                "mastercard",
                "amex",
                "discover"
              ]
            },
            "expirationDate": {
              "type": "string",
              "description": "Expiration date in YYYY-MM format as written on card.",
              "example": "2020-04",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])$",
              "minLength": 7,
              "maxLength": 7
            },
            "name": {
              "type": "string",
              "description": "Cardholder's name as written on card.",
              "example": "Alice Smith"
            },
            "cvv": {
              "type": "string",
              "description": "Security code written on card, 3- or 4-digit number.",
              "example": "123",
              "minLength": 3,
              "maxLength": 4
            },
            "binReplacement": {
              "type": "string",
              "description": "Experimental. BIN to replace with, where possible.",
              "example": "467095",
              "minLength": 6,
              "maxLength": 6
            }
          },
          "required": [
            "type",
            "brand",
            "expirationDate",
            "name",
            "cvv"
          ],
          "additionalProperties": false
        },
        "PanToken": {
          "type": "string",
          "description": "An encrypted PAN token, obtained from Automation Cloud Vault. Please consult \"Vaulting Payment Card Information\" section of Documentation for information on how to acquire it.",
          "example": "5d41402abc4b2a76b9719d911017c592",
          "minLength": 15
        },
        "CountryCode": {
          "type": "string",
          "title": "ISO 3166-1 alpha-2 Country Code",
          "description": "ISO 3166-1 alpha-2 code representing the country. United Kingdom is officially assigned the alpha-2 code gb rather than uk. Lowercase.",
          "example": "us",
          "minLength": 2,
          "maxLength": 2,
          "enum": [
            "ad",
            "ae",
            "af",
            "ag",
            "ai",
            "al",
            "am",
            "ao",
            "aq",
            "ar",
            "as",
            "at",
            "au",
            "aw",
            "ax",
            "az",
            "ba",
            "bb",
            "bd",
            "be",
            "bf",
            "bg",
            "bh",
            "bi",
            "bj",
            "bl",
            "bm",
            "bn",
            "bo",
            "bq",
            "br",
            "bs",
            "bt",
            "bv",
            "bw",
            "by",
            "bz",
            "ca",
            "cc",
            "cd",
            "cf",
            "cg",
            "ch",
            "ci",
            "ck",
            "cl",
            "cm",
            "cn",
            "co",
            "cr",
            "cu",
            "cv",
            "cw",
            "cx",
            "cy",
            "cz",
            "de",
            "dj",
            "dk",
            "dm",
            "do",
            "dz",
            "ec",
            "ee",
            "eg",
            "eh",
            "er",
            "es",
            "et",
            "fi",
            "fj",
            "fk",
            "fm",
            "fo",
            "fr",
            "ga",
            "gb",
            "gd",
            "ge",
            "gf",
            "gg",
            "gh",
            "gi",
            "gl",
            "gm",
            "gn",
            "gp",
            "gq",
            "gr",
            "gs",
            "gt",
            "gu",
            "gw",
            "gy",
            "hk",
            "hm",
            "hn",
            "hr",
            "ht",
            "hu",
            "id",
            "ie",
            "il",
            "im",
            "in",
            "io",
            "iq",
            "ir",
            "is",
            "it",
            "je",
            "jm",
            "jo",
            "jp",
            "ke",
            "kg",
            "kh",
            "ki",
            "km",
            "kn",
            "kp",
            "kr",
            "kw",
            "ky",
            "kz",
            "la",
            "lb",
            "lc",
            "li",
            "lk",
            "lr",
            "ls",
            "lt",
            "lu",
            "lv",
            "ly",
            "ma",
            "mc",
            "md",
            "me",
            "mf",
            "mg",
            "mh",
            "mk",
            "ml",
            "mm",
            "mn",
            "mo",
            "mp",
            "mq",
            "mr",
            "ms",
            "mt",
            "mu",
            "mv",
            "mw",
            "mx",
            "my",
            "mz",
            "na",
            "nc",
            "ne",
            "nf",
            "ng",
            "ni",
            "nl",
            "no",
            "np",
            "nr",
            "nu",
            "nz",
            "om",
            "pa",
            "pe",
            "pf",
            "pg",
            "ph",
            "pk",
            "pl",
            "pm",
            "pn",
            "pr",
            "ps",
            "pt",
            "pw",
            "py",
            "qa",
            "re",
            "ro",
            "rs",
            "ru",
            "rw",
            "sa",
            "sb",
            "sc",
            "sd",
            "se",
            "sg",
            "sh",
            "si",
            "sj",
            "sk",
            "sl",
            "sm",
            "sn",
            "so",
            "sr",
            "ss",
            "st",
            "sv",
            "sx",
            "sy",
            "sz",
            "tc",
            "td",
            "tf",
            "tg",
            "th",
            "tj",
            "tk",
            "tl",
            "tm",
            "tn",
            "to",
            "tr",
            "tt",
            "tv",
            "tw",
            "tz",
            "ua",
            "ug",
            "um",
            "us",
            "uy",
            "uz",
            "va",
            "vc",
            "ve",
            "vg",
            "vi",
            "vn",
            "vu",
            "wf",
            "ws",
            "xk",
            "ye",
            "yt",
            "za",
            "zm",
            "zw"
          ]
        },
        "CountrySubdivision": {
          "type": "string",
          "description": "Full name of country subdivision (e.g. state, region, county, etc.), except for US states which require 2 letter code. Lowercased.",
          "example": "ca"
        },
        "CurrencyCode": {
          "type": "string",
          "minLength": 3,
          "maxLength": 3,
          "title": "ISO 4217 Currency Code",
          "description": "ISO 4217 3-letter code representing the currency. Lowercase.",
          "example": "usd",
          "enum": [
            "aed",
            "afn",
            "all",
            "amd",
            "ang",
            "aoa",
            "ars",
            "aud",
            "awg",
            "azn",
            "bam",
            "bbd",
            "bdt",
            "bgn",
            "bhd",
            "bif",
            "bmd",
            "bnd",
            "bob",
            "brl",
            "bsd",
            "btn",
            "bwp",
            "byn",
            "bzd",
            "cad",
            "cdf",
            "chf",
            "clp",
            "cny",
            "cop",
            "crc",
            "cup",
            "czk",
            "djf",
            "dkk",
            "dop",
            "dzd",
            "egp",
            "ern",
            "etb",
            "eur",
            "fjd",
            "fkp",
            "gbp",
            "gel",
            "ggp",
            "ghs",
            "gip",
            "gmd",
            "gnf",
            "gtq",
            "gyd",
            "hkd",
            "hnl",
            "hrk",
            "huf",
            "idr",
            "ils",
            "imp",
            "inr",
            "iqd",
            "irr",
            "isk",
            "jep",
            "jmd",
            "jod",
            "jpy",
            "kes",
            "kgs",
            "khr",
            "kmf",
            "kpw",
            "krw",
            "kwd",
            "kyd",
            "kzt",
            "lak",
            "lbp",
            "lkr",
            "lrd",
            "lsl",
            "ltl",
            "lyd",
            "mad",
            "mdl",
            "mga",
            "mkd",
            "mmk",
            "mnt",
            "mop",
            "mro",
            "mur",
            "mvr",
            "mwk",
            "mxn",
            "myr",
            "mzn",
            "nad",
            "ngn",
            "nio",
            "nok",
            "npr",
            "nzd",
            "omr",
            "pab",
            "pen",
            "pgk",
            "php",
            "pkr",
            "pln",
            "pyg",
            "qar",
            "ron",
            "rsd",
            "rub",
            "rwf",
            "sar",
            "sbd",
            "scr",
            "sdg",
            "sek",
            "sgd",
            "shp",
            "sle",
            "sll",
            "sos",
            "srd",
            "ssp",
            "std",
            "svc",
            "syp",
            "szl",
            "thb",
            "tjs",
            "tmt",
            "tnd",
            "try",
            "ttd",
            "tvd",
            "twd",
            "tzs",
            "uah",
            "ugx",
            "usd",
            "uyu",
            "uzs",
            "vef",
            "vnd",
            "vuv",
            "wst",
            "xaf",
            "xcd",
            "xof",
            "xpf",
            "yer",
            "zar",
            "zmw",
            "zwd",
            "zwl"
          ]
        },
        "StructuredText": {
          "type": "object",
          "description": "A list of structured text.",
          "properties": {
            "type": {
              "enum": [
                "StructuredText"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the text grouping."
            },
            "contents": {
              "type": "array",
              "description": "An array of structured text items.",
              "items": {
                "$ref": "#/domains/Generic/types/StructuredTextItem"
              }
            }
          },
          "required": [
            "type",
            "name",
            "contents"
          ],
          "additionalProperties": false
        },
        "StructuredPrice": {
          "type": "object",
          "description": "A list of structured text.",
          "properties": {
            "type": {
              "enum": [
                "StructuredPrice"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the text grouping."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "priceLine": {
              "type": "string"
            },
            "description": {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            },
            "contents": {
              "type": "array",
              "description": "An array of structured text items.",
              "items": {
                "$ref": "#/domains/Generic/types/StructuredTextItem"
              }
            }
          },
          "required": [
            "type",
            "name",
            "price"
          ],
          "additionalProperties": false
        },
        "StructuredTextItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredText"
            },
            {
              "$ref": "#/domains/Generic/types/File"
            },
            {
              "$ref": "#/domains/Generic/types/Link"
            },
            {
              "$ref": "#/domains/Generic/types/NamedText"
            },
            {
              "$ref": "#/domains/Generic/types/StructuredPrice"
            },
            {
              "$ref": "#/domains/Generic/types/NamedPrice"
            },
            {
              "$ref": "#/domains/Generic/types/HTML"
            },
            {
              "$ref": "#/domains/Generic/types/Text"
            }
          ]
        },
        "StructuredTextItems": {
          "type": "array",
          "description": "List of available structured text items.",
          "items": {
            "$ref": "#/domains/Generic/types/StructuredTextItem"
          }
        },
        "File": {
          "type": "object",
          "description": "A document downloaded from the target website.<br/>To retrieve this document, you must include the <strong>SECRET_KEY</strong> authorisation header with your request.",
          "properties": {
            "type": {
              "enum": [
                "File"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the document."
            },
            "url": {
              "type": "string",
              "description": "Location of the resource."
            },
            "filename": {
              "type": "string",
              "description": "The name of the file, including the extension."
            },
            "headers": {
              "type": "object",
              "description": "List of relevant headers associated with the uri.",
              "items": {
                "type": "object",
                "properties": {},
                "required": [],
                "additionalProperties": {
                  "type": "string"
                }
              },
              "example": [
                {
                  "Authorization": "Bearer abc123"
                }
              ]
            }
          },
          "required": [
            "type",
            "url",
            "filename"
          ],
          "additionalProperties": false
        },
        "Link": {
          "type": "object",
          "description": "A document accessible on the target website.",
          "properties": {
            "type": {
              "enum": [
                "Link"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the document."
            },
            "url": {
              "type": "string",
              "format": "url",
              "description": "Location of the resource."
            }
          },
          "required": [
            "type",
            "name",
            "url"
          ],
          "additionalProperties": false
        },
        "NamedText": {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "NamedText"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the text."
            },
            "text": {
              "type": "string",
              "description": "Location of the resource."
            }
          },
          "required": [
            "type",
            "name",
            "text"
          ],
          "additionalProperties": false
        },
        "NamedPrice": {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "NamedPrice"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the price."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type",
            "name",
            "price"
          ],
          "additionalProperties": false
        },
        "Text": {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "Text"
              ]
            },
            "text": {
              "type": "string",
              "description": "Location of the resource."
            }
          },
          "required": [
            "type",
            "text"
          ],
          "additionalProperties": false
        },
        "NamedContents": {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "NamedContents"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the text."
            },
            "contents": {
              "type": "array",
              "description": "An array of structured text items.",
              "items": {
                "$ref": "#/domains/Generic/types/StructuredTextItem"
              }
            }
          },
          "required": [
            "type",
            "name",
            "contents"
          ],
          "additionalProperties": false
        },
        "HTML": {
          "type": "object",
          "description": "Inner HTML contents of an element.",
          "properties": {
            "type": {
              "enum": [
                "HTML"
              ]
            },
            "name": {
              "type": "string",
              "description": "Optional name or title of the HTML section."
            },
            "html": {
              "type": "string",
              "description": "HTML contents."
            }
          },
          "required": [
            "type",
            "html"
          ],
          "additionalProperties": false
        },
        "AnyPhoneString": {
          "type": "string",
          "description": "Any phone-like string. Must only contain digits and symbol separators (parens, dashes, plus sign, spaces, other common phone number separators.",
          "example": "+44 (0) 747-444-7447"
        }
      },
      "errors": [
        {
          "code": "InputInvalid",
          "category": "client",
          "description": "Failed to create a job due to invalid input"
        },
        {
          "code": "JobCancelled",
          "category": "client",
          "description": "Job cancelled by client"
        },
        {
          "code": "InputTimeout",
          "category": "client",
          "description": "Input was not provided within 15 minutes"
        },
        {
          "code": "TdsTimeout",
          "category": "client",
          "description": "3D Secure was not completed by the card holder"
        },
        {
          "code": "InputRejected",
          "category": "client",
          "description": "Replacement for rejected input was not provided within 15 minutes"
        },
        {
          "code": "PaymentRejected",
          "category": "client",
          "description": "Payment rejected due to a problem with the card. A message will be forwarded from the website if available"
        },
        {
          "code": "CardDetailsInvalid",
          "category": "client",
          "description": "Unable to process payment as card details are invalid"
        },
        {
          "code": "AddressInvalid",
          "category": "client",
          "description": "Invalid address provided"
        },
        {
          "code": "AccountDetailsInvalid",
          "category": "client",
          "description": "Cannot sign in as invalid account details provided"
        },
        {
          "code": "PaymentDetailsInvalid",
          "category": "client",
          "description": "Cannot submit or process the payment because the payment details provided are invalid."
        },
        {
          "code": "CardTypeNotSupported",
          "category": "client",
          "description": "Cannot submit or process the payment because the card type is not supported by this supplier."
        },
        {
          "code": "UrlInvalid",
          "category": "client",
          "description": "Invalid url provided"
        },
        {
          "code": "UnsupportedWebsiteLanguage",
          "category": "client",
          "description": "The deeplink or url landed on a page in an unsupported language."
        },
        {
          "code": "FinalPriceNotFound",
          "category": "client",
          "description": "Final price provided does not match expectation"
        },
        {
          "code": "PanTokenInvalid",
          "category": "client",
          "description": "Invalid pan token provided"
        },
        {
          "code": "CookieInvalid",
          "category": "client",
          "description": "Invalid cookie provided"
        },
        {
          "code": "PriceRangeExceeded",
          "category": "client",
          "description": "Price range exceeded input specifications."
        },
        {
          "code": "AuthenticationError",
          "category": "client",
          "description": "The authentication attempt failed."
        },
        {
          "code": "PriceChangedAfterConsent",
          "category": "website",
          "description": "Price changed after final price consent."
        },
        {
          "code": "WebsiteValidationFailed",
          "category": "website",
          "description": "Website's validation rule doesn't allow the input data"
        },
        {
          "code": "SystemUnavailable",
          "category": "website",
          "description": "Website system is down/Website doesn't work at the moment"
        },
        {
          "code": "KnownLimitation",
          "category": "website",
          "description": "Cannot process due to known limitation"
        },
        {
          "code": "GenericWebsiteError",
          "category": "website",
          "description": "Website threw general error during automation process. A message will be forwarded from the website if available"
        },
        {
          "code": "UnableToContinueProcess",
          "category": "website",
          "description": "Process couldn't reach the final step. Website finished the process early",
          "example": "Unable to purchase online"
        },
        {
          "code": "SessionExpired",
          "category": "website",
          "description": "The website timed out the session. Each website has its own timeout settings, usually after inactivity such as waiting too long for an input.",
          "example": "Your basket has expired, you must complete the purchase within 5 minutes."
        },
        {
          "code": "ServerError",
          "category": "server",
          "description": "Server Error"
        },
        {
          "code": "JobTimeout",
          "category": "server",
          "description": "Job timeout after an hour of job creation without reaching the final step."
        },
        {
          "code": "BotDetection",
          "category": "server",
          "description": "The automation could not continue because it was bot detected and the available countermeasures did not work around the issue."
        }
      ]
    },
    "HolidayBooking": {
      "description": "Allows automating holiday package booking on individual suppliers and OTAs.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "options": {
          "typeRef": "#/domains/HolidayBooking/types/Options",
          "default": {},
          "initial": true,
          "description": "A set of options that define the automation's behaviour."
        },
        "selectedBoard": {
          "typeRef": "#/domains/HolidayBooking/types/Board",
          "description": "One of availableBoards.",
          "sourceOutputKey": "availableBoards",
          "inputMethod": "SelectOne"
        },
        "selectedFlightBundle": {
          "typeRef": "#/domains/HolidayBooking/types/FlightBundle",
          "description": "One of availableFlightBundles.",
          "sourceOutputKey": "availableFlightBundles",
          "inputMethod": "SelectOne"
        },
        "selectedRoomType": {
          "typeRef": "#/domains/HolidayBooking/types/RoomType",
          "description": "One of availableRoomTypes.",
          "sourceOutputKey": "availableRoomTypes",
          "inputMethod": "SelectOne"
        },
        "selectedHotelTransfer": {
          "typeRef": "#/domains/HolidayBooking/types/HotelTransfer",
          "description": "One of availableHotelTransfers.",
          "sourceOutputKey": "availableHotelTransfers",
          "inputMethod": "SelectOne"
        },
        "selectedDeposit": {
          "typeRef": "#/domains/HolidayBooking/types/Deposit",
          "description": "One of availableDeposits."
        },
        "passengers": {
          "typeRef": "#/domains/HolidayBooking/types/Passengers",
          "initial": true
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        }
      },
      "outputs": {
        "estimatedPriceBreakdown": {
          "typeRef": "#/domains/HolidayBooking/types/PriceBreakdown",
          "description": "The list of price components, as found on the website."
        },
        "estimatedTotalPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "finalPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "priceBreakdown": {
          "typeRef": "#/domains/HolidayBooking/types/PriceBreakdown",
          "description": "The list of price components, as found on the website."
        },
        "availableBoards": {
          "typeRef": "#/domains/HolidayBooking/types/Boards"
        },
        "availableFlightBundles": {
          "typeRef": "#/domains/HolidayBooking/types/FlightBundles"
        },
        "availableRoomTypes": {
          "typeRef": "#/domains/HolidayBooking/types/RoomTypes"
        },
        "availableHotelTransfers": {
          "typeRef": "#/domains/HolidayBooking/types/HotelTransfers"
        },
        "availableDeposits": {
          "typeRef": "#/domains/HolidayBooking/types/Deposits"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/HolidayBooking/types/BookingConfirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "default": {}
        },
        "PriceBreakdown": {
          "type": "array",
          "description": "The list of price components, as found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/HolidayBooking/types/PriceBreakdownItem"
          }
        },
        "PriceBreakdownItem": {
          "type": "object",
          "description": "A component of the price breakdown.",
          "properties": {
            "text": {
              "type": "string",
              "description": "The description of an item on the price breakdown list, as found on the website.",
              "example": "Credit card charge"
            },
            "price": {
              "typeRef": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "text",
            "price"
          ]
        },
        "HotelTransfers": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HolidayBooking/types/HotelTransfer"
          }
        },
        "HotelTransfer": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type"
          ],
          "additionalProperties": false
        },
        "RoomTypes": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HolidayBooking/types/RoomType"
          }
        },
        "RoomType": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type"
          ],
          "additionalProperties": false
        },
        "FlightBundles": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HolidayBooking/types/FlightBundle"
          }
        },
        "FlightBundle": {
          "type": "object",
          "description": "Outbound and inbound flights specification.",
          "properties": {
            "outbound": {
              "$ref": "#/domains/HolidayBooking/types/Flight"
            },
            "inbound": {
              "$ref": "#/domains/HolidayBooking/types/Flight"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "outbound",
            "inbound",
            "price"
          ],
          "additionalProperties": false
        },
        "Flight": {
          "type": "object",
          "description": "Outbound and inbound flights specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/HolidayBooking/types/DateTimeAirport"
            },
            "destination": {
              "$ref": "#/domains/HolidayBooking/types/DateTimeAirport"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "DateTimeAirport": {
          "type": "object",
          "properties": {
            "dateTime": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "description": "Date and time of flight (airport local time).",
              "example": "2018-02-02 19:40"
            },
            "airportCode": {
              "$ref": "#/domains/HolidayBooking/types/AirportCode"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of airport.",
              "example": "us"
            }
          },
          "required": [
            "dateTime",
            "airportCode"
          ],
          "additionalProperties": false
        },
        "AirportCode": {
          "type": "string",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "^[A-Z]{3}$",
          "description": "International Air Transport Association airport code.",
          "example": "SFO"
        },
        "Boards": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HolidayBooking/types/Board"
          }
        },
        "Board": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type"
          ],
          "additionalProperties": false
        },
        "Deposits": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HolidayBooking/types/Deposit"
          }
        },
        "Deposit": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name",
            "price"
          ],
          "additionalProperties": false
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/HolidayBooking/types/Passenger"
          }
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "addAdditionalLuggage": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3,
              "default": 0
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName",
            "dateOfBirth",
            "addAdditionalLuggage"
          ],
          "additionalProperties": false
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        }
      },
      "errors": []
    },
    "HotelBooking": {
      "description": "Allows automating hotel booking on individual suppliers and OTAs.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "dataExtractionDomainId": "HotelBookingExtraction",
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "search": {
          "typeRef": "#/domains/HotelBooking/types/Search"
        },
        "options": {
          "typeRef": "#/domains/HotelBooking/types/Options",
          "default": {},
          "initial": true,
          "description": "A set of options that define the automation's behaviour."
        },
        "selectedRooms": {
          "typeRef": "#/domains/HotelBooking/types/Rooms",
          "description": "List of rooms to be booked in one go. Depending on the supplier, only one item may be allowed.",
          "sourceOutputKey": "availableRooms",
          "inputMethod": "SelectMany"
        },
        "selectedHotel": {
          "typeRef": "#/domains/HotelBooking/types/Hotel",
          "description": "Selected hotel.",
          "sourceOutputKey": "availableHotels",
          "inputMethod": "SelectOne"
        },
        "selectedSearchRate": {
          "typeRef": "#/domains/HotelBooking/types/SearchRate",
          "description": "Selected search rate.",
          "sourceOutputKey": "availableSearchRates",
          "inputMethod": "SelectOne"
        },
        "guestAges": {
          "typeRef": "#/domains/Generic/types/Ages",
          "description": "List of guest ages."
        },
        "mainGuest": {
          "typeRef": "#/domains/HotelBooking/types/MainGuest",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/person",
            "/contact/email"
          ]
        },
        "guests": {
          "typeRef": "#/domains/HotelBooking/types/Guests",
          "description": "Personal details about the guests."
        },
        "visit": {
          "typeRef": "#/domains/HotelBooking/types/Visit",
          "description": "Details about the visit."
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account",
          "description": "If required, used for logging in."
        },
        "payment": {
          "typeRef": "#/domains/HotelBooking/types/Payment"
        },
        "selectedPaymentMethod": {
          "typeRef": "#/domains/HotelBooking/types/PaymentMethod",
          "sourceOutputKey": "availablePaymentMethods",
          "inputMethod": "SelectOne"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "discount": {
          "typeRef": "#/domains/HotelBooking/types/Discount"
        },
        "loginConfirmationCode": {
          "typeRef": "#/domains/HotelBooking/types/ConfirmationCode",
          "description": "When logging in, some websites require a confirmation code."
        }
      },
      "outputs": {
        "availableSearchRates": {
          "typeRef": "#/domains/HotelBooking/types/SearchRates",
          "description": "List of room rates."
        },
        "availableHotels": {
          "typeRef": "#/domains/HotelBooking/types/Hotels",
          "description": "List of hotels found on the supplier's website."
        },
        "availableRooms": {
          "typeRef": "#/domains/HotelBooking/types/Rooms",
          "description": "List of rooms found on the supplier's website."
        },
        "guestsAgeRanges": {
          "typeRef": "#/domains/HotelBooking/types/AgeRanges",
          "description": "Age ranges. Guest type min/max age."
        },
        "totalBookingPrice": {
          "typeRef": "#/domains/HotelBooking/types/TotalPrice",
          "description": "Total price of the current booking."
        },
        "availablePaymentMethods": {
          "typeRef": "#/domains/HotelBooking/types/PaymentMethods",
          "description": "List of payment methods found on the supplier's website."
        },
        "hotelDetails": {
          "typeRef": "#/domains/HotelBooking/types/HotelDetails",
          "description": "Details about the hotel."
        },
        "supportedCards": {
          "typeRef": "#/domains/HotelBooking/types/SupportedCards",
          "description": "List of card brands and types found on the supplier's website."
        },
        "priceBreakdown": {
          "typeRef": "#/domains/HotelBooking/types/PriceBreakdown",
          "description": "Total price breakdown."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/HotelBooking/types/BookingConfirmation"
        },
        "billingPrice": {
          "typeRef": "#/domains/Generic/types/Price"
        },
        "loggedIn": {
          "typeRef": "#/domains/HotelBooking/types/Boolean"
        },
        "availableRoomsFinished": {
          "typeRef": "#/domains/HotelBooking/types/Boolean"
        },
        "bookingInputs": {
          "typeRef": "#/domains/HotelBooking/types/BookingInputs",
          "description": "Echoed non-PII inputs"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "description": "If <code>true</code>, returns a fake success without making a booking.",
              "default": false
            },
            "useSearchNotUrl": {
              "type": "boolean",
              "description": "If <code>true</code>, uses the search input.",
              "default": false
            },
            "searchRates": {
              "type": "boolean",
              "description": "If <code>true</code>, enables special rates output and input at search.",
              "default": false
            },
            "showMemberRates": {
              "type": "boolean",
              "description": "If <code>true</code>, enables member rates output and input at room selection.",
              "default": false
            },
            "enableDiscountCode": {
              "type": "boolean",
              "description": "If <code>true</code>, enables the discount code input.",
              "default": false
            },
            "outputAvailableRoomsOnce": {
              "type": "boolean",
              "description": "If <code>true</code>, the availableRooms output is delayed until the website's prices get their final update.",
              "default": false
            },
            "userAgent": {
              "type": "string",
              "description": "Enables custom user-agent header when performing automations."
            }
          }
        },
        "Discount": {
          "type": "object",
          "description": "Discount code.",
          "properties": {
            "code": {
              "type": "string",
              "description": "Discount code",
              "example": "RL2XYZ"
            },
            "agentCode": {
              "type": "string",
              "description": "Agent code to unlock special discount codes",
              "example": "ABC1234"
            }
          },
          "additionalProperties": false,
          "required": [
            "code"
          ]
        },
        "Visit": {
          "type": "object",
          "properties": {
            "purpose": {
              "type": "string",
              "enum": [
                "business",
                "leisure"
              ]
            },
            "message": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "SupportedCards": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelBooking/types/CardBrandType"
          }
        },
        "ConfirmationCode": {
          "type": "string",
          "minLength": 1,
          "example": "ABC123"
        },
        "CardBrandType": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "description": "Card type, debit or credit.",
              "enum": [
                "debit",
                "credit"
              ]
            },
            "brand": {
              "type": "string",
              "description": "Card brand.",
              "enum": [
                "visa",
                "mastercard",
                "amex",
                "discover"
              ]
            }
          },
          "required": [
            "brand",
            "type"
          ],
          "additionalProperties": false
        },
        "SearchRates": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelBooking/types/SearchRate"
          }
        },
        "SearchRate": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "Senior Discounts"
            },
            "text": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Search": {
          "type": "object",
          "properties": {
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "rooms": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/HotelBooking/types/SearchRoom"
              }
            },
            "text": {
              "type": "string",
              "example": "London, UK",
              "minLength": 3
            },
            "currencyCode": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "languageCode": {
              "type": "string",
              "minLength": 2
            },
            "hotelId": {
              "type": "string"
            }
          },
          "required": [
            "checkInDate",
            "checkOutDate",
            "rooms"
          ],
          "additionalProperties": false
        },
        "SearchRoom": {
          "type": "object",
          "properties": {
            "ages": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "number",
                "minimum": 0,
                "maximum": 150,
                "exmaple": 31
              }
            }
          },
          "required": [
            "ages"
          ],
          "additionalProperties": false
        },
        "Hotels": {
          "type": "array",
          "description": "A list of hotels.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/HotelBooking/types/Hotel"
          }
        },
        "HotelDetails": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "My Hotel"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Hotel": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "My Hotel"
            },
            "priceLine": {
              "type": "string",
              "minLength": 1,
              "example": "From 188 GBP Avg./night"
            },
            "addressLine": {
              "type": "string",
              "minLength": 1,
              "example": "21 Piccadilly London, United Kingdom W1J 0BH"
            },
            "images": {
              "type": "array",
              "description": "A list of images.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Rooms": {
          "type": "array",
          "description": "A list of rooms.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/HotelBooking/types/Room"
          }
        },
        "RoomDescription": {
          "type": "array",
          "description": "A list to describe a room or a rate.",
          "minItems": 0,
          "items": {
            "type": "string",
            "example": "Maximum occupancy: 2"
          }
        },
        "Room": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "example": "Standard Single Room"
            },
            "name": {
              "type": "string",
              "example": "Room with Window"
            },
            "rate": {
              "type": "string",
              "example": "Breakfast Plus"
            },
            "description": {
              "$ref": "#/domains/HotelBooking/types/RoomDescription"
            },
            "rateDescription": {
              "$ref": "#/domains/HotelBooking/types/RoomDescription"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            },
            "strikePrice": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 30600,
                "currency": "gbp"
              }
            },
            "priceLines": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelBooking/types/PriceLineItem"
              }
            },
            "cancellation": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "full-refundable",
                    "flexible-refundable",
                    "non-refundable",
                    "unknown"
                  ]
                },
                "details": {
                  "$ref": "#/domains/Generic/types/StructuredTextItem",
                  "example": {
                    "type": "Text",
                    "text": "Free cancellation up to 24h before. Cancellation not allowed afterwards."
                  }
                }
              },
              "required": [
                "code"
              ],
              "additionalProperties": false
            },
            "valueAdditions": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelBooking/types/ValueAddition"
              }
            },
            "occupancy": {
              "type": "object",
              "properties": {
                "adults": {
                  "type": "number"
                },
                "children": {
                  "type": "number"
                },
                "infants": {
                  "type": "number"
                }
              },
              "required": [
                "adults"
              ],
              "additionalProperties": false
            },
            "rateGroup": {
              "type": "string",
              "example": "standard"
            },
            "isMemberRate": {
              "type": "boolean",
              "example": true
            },
            "images": {
              "type": "array",
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            }
          },
          "required": [
            "type",
            "price",
            "cancellation",
            "valueAdditions"
          ],
          "additionalProperties": false
        },
        "ValueAddition": {
          "type": "string",
          "enum": [
            "pay-later",
            "free-breakfast",
            "free-half-board",
            "free-full-board",
            "free-all-inclusive",
            "free-parking",
            "free-internet"
          ]
        },
        "PriceBreakdown": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelBooking/types/PriceLineItem"
          }
        },
        "PriceLineItem": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "net-rate",
                "city-tax",
                "vat",
                "hotel-fee",
                "resort-fee",
                "service-fee",
                "booking-fee",
                "total-now",
                "total-later",
                "total-later-supplier",
                "total-overall",
                "total-overall-supplier",
                "others"
              ]
            },
            "paidAtHotel": {
              "type": "boolean"
            },
            "excludedFromTotals": {
              "type": "boolean"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            }
          },
          "required": [
            "type",
            "description",
            "price"
          ],
          "additionalProperties": false
        },
        "PaymentMethods": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelBooking/types/PaymentMethod"
          }
        },
        "PaymentMethod": {
          "type": "string",
          "enum": [
            "card",
            "paypal",
            "direct-debit",
            "bank-transfer",
            "no-prepayment"
          ]
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/HotelBooking/types/Person"
            },
            "contact": {
              "$ref": "#/domains/HotelBooking/types/GuestContact"
            },
            "memberId": {
              "$ref": "#/domains/HotelBooking/types/MemberId"
            }
          },
          "required": [
            "person",
            "contact"
          ],
          "additionalProperties": false
        },
        "MemberId": {
          "type": "object",
          "properties": {
            "number": {
              "type": "string",
              "example": "12345"
            }
          },
          "required": [
            "number"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "phone": {
              "$ref": "#/domains/Generic/types/AnyPhoneString"
            },
            "email": {
              "type": "string",
              "description": "Email address used for contact.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [
            "phone",
            "email"
          ],
          "additionalProperties": false
        },
        "Guests": {
          "type": "array",
          "description": "A list of guests.",
          "minItems": 1,
          "pii": true,
          "items": {
            "$ref": "#/domains/HotelBooking/types/Person"
          }
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "AgeRanges": {
          "type": "object",
          "properties": {
            "children": {
              "$ref": "#/domains/HotelBooking/types/AgeRange"
            },
            "infants": {
              "$ref": "#/domains/HotelBooking/types/AgeRange"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AgeRange": {
          "type": "object",
          "properties": {
            "minAge": {
              "type": "integer"
            },
            "maxAge": {
              "type": "integer"
            }
          },
          "required": [
            "minAge",
            "maxAge"
          ],
          "additionalProperties": false
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "TotalPrice": {
          "type": "object",
          "description": "Total booking price that includes pay now and pay later",
          "properties": {
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "price"
          ]
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "person": {
              "$ref": "#/domains/HotelBooking/types/Person"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "Boolean": {
          "type": "boolean"
        },
        "BookingInputs": {
          "type": "object",
          "description": "Some of the inputs sent to the job, reflected back.",
          "pii": false,
          "properties": {
            "search": {
              "$ref": "#/domains/HotelBooking/types/Search"
            },
            "selectedRooms": {
              "$ref": "#/domains/HotelBooking/types/Rooms"
            }
          },
          "required": [
            "search",
            "selectedRooms"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "RoomNotAvailable",
          "category": "client",
          "description": "The website claims the room is not available for the selected dates."
        },
        {
          "code": "DiscountCodeInvalid",
          "category": "client",
          "description": "The website claims the discount code provided is invalid."
        },
        {
          "code": "MultipleRoomsRequired",
          "category": "client",
          "description": "Multiple rooms required for the requested amount of guests."
        },
        {
          "code": "MinimumStayRequired",
          "category": "client",
          "description": "The minimum stay requirement is not met."
        },
        {
          "code": "GuestDetailsInvalid",
          "category": "client",
          "description": "The guest details are invalid."
        }
      ]
    },
    "HotelBookingBG": {
      "description": "Allows automating hotel booking on individual suppliers and OTAs for Book & Go",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/confirmationNumber"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "search": {
          "typeRef": "#/domains/HotelBookingBG/types/Search"
        },
        "checkoutId": {
          "typeRef": "#/domains/HotelBookingBG/types/CheckoutId"
        },
        "jobId": {
          "typeRef": "#/domains/HotelBookingBG/types/JobId"
        },
        "options": {
          "typeRef": "#/domains/HotelBookingBG/types/Options",
          "default": {},
          "initial": true,
          "description": "A set of options that define the automation's behaviour."
        },
        "guestData": {
          "typeRef": "#/domains/HotelBookingBG/types/GuestData",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/firstName",
            "/lastName",
            "/email"
          ]
        },
        "roomsOccupancies": {
          "typeRef": "#/domains/HotelBookingBG/types/RoomOccupancy"
        },
        "payment": {
          "typeRef": "#/domains/HotelBookingBG/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        }
      },
      "outputs": {
        "availableRooms": {
          "typeRef": "#/domains/HotelBookingBG/types/Rooms"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/HotelBookingBG/types/BookingConfirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "description": "If <code>true</code>, returns a fake success without making a booking.",
              "default": false
            }
          }
        },
        "CheckoutId": {
          "type": "string"
        },
        "JobId": {
          "type": "string"
        },
        "ConfirmationCode": {
          "type": "string",
          "minLength": 1,
          "example": "ABC123"
        },
        "Search": {
          "type": "object",
          "properties": {
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "rooms": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/HotelBookingBG/types/SearchRoom"
              }
            },
            "currencyCode": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "languageCode": {
              "type": "string",
              "minLength": 2
            }
          },
          "required": [
            "checkInDate",
            "checkOutDate",
            "rooms"
          ],
          "additionalProperties": true
        },
        "SearchRoom": {
          "type": "object",
          "properties": {
            "ages": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "number",
                "minimum": 0,
                "maximum": 150,
                "exmaple": 31
              }
            }
          },
          "required": [
            "ages"
          ],
          "additionalProperties": false
        },
        "Rooms": {
          "type": "array",
          "description": "A list of rooms.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/HotelBookingBG/types/Room"
          }
        },
        "Room": {
          "type": "object",
          "properties": {
            "roomName": {
              "type": "string",
              "example": "Room with Window"
            },
            "roomDescription": {
              "type": "string",
              "example": "A brief description of the room deal, if available. (eg: Room is pet-friendly and comes with a view)"
            },
            "amenities": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelBookingBG/types/Amenity"
              }
            },
            "rates": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelBookingBG/types/Rate"
              }
            },
            "maximumOccupancy": {
              "type": "object",
              "properties": {
                "maxAdults": {
                  "type": "number"
                },
                "maxChildren": {
                  "type": "number"
                }
              },
              "required": [
                "adults"
              ],
              "additionalProperties": false
            },
            "images": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "roomName",
            "rates"
          ],
          "additionalProperties": false
        },
        "Rate": {
          "type": "object",
          "properties": {
            "checkoutId": {
              "type": "string"
            },
            "rateType": {
              "type": "string",
              "enum": [
                "Default",
                "Mobile",
                "Reward"
              ]
            },
            "boardCode": {
              "$ref": "#/domains/HotelBookingBG/types/BoardCode"
            },
            "boardDescription": {
              "type": "string",
              "example": "A more detailed description of the board type (e.g., Includes breakfast for 2 guests)"
            },
            "cancellationPolicy": {
              "$ref": "#/domains/HotelBookingBG/types/CancellationPolicy"
            },
            "price": {
              "type": "object",
              "properties": {
                "totalPrice": {
                  "type": "number"
                },
                "currency": {
                  "$ref": "#/domains/Generic/types/CurrencyCode"
                },
                "priceElements": {
                  "type": "array",
                  "items": {
                    "$ref": "#/domains/HotelBookingBG/types/PriceElement"
                  }
                }
              }
            }
          },
          "required": [
            "checkoutId",
            "rateType",
            "boardCode",
            "cancellationPolicy",
            "price"
          ],
          "additionalProperties": false
        },
        "BoardCode": {
          "type": "string",
          "enum": [
            "RoomOnly",
            "BedAndBreakfast",
            "HalfBoard",
            "FullBoard",
            "AllInclusive"
          ]
        },
        "CancellationPolicy": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "NonRefundable",
                "FullyRefundable",
                "PartiallyRefundable"
              ]
            },
            "detailedDescription": {
              "type": "string",
              "example": "The detailed description of the cancellation policy containing information about partial refunds"
            },
            "penalties": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelBookingBG/types/CancellationPenalty"
              }
            }
          }
        },
        "Amenity": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "mostPopular": {
              "type": "boolean",
              "description": "If marked on website as one of the popular choices"
            }
          }
        },
        "PriceElement": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "NetRate",
                "TaxesAndFees",
                "HotelFees"
              ]
            },
            "name": {
              "type": "string"
            },
            "value": {
              "type": "number"
            },
            "currency": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            }
          }
        },
        "CancellationPenalty": {
          "type": "object",
          "properties": {
            "from": {
              "type": "string",
              "format": "date",
              "description": "Date determined from which time stamp this penalty is applied. If the penalty is applied from the time of booking, this field must not be provided (only the field 'fee' will be provided in the Penalty object)"
            },
            "fee": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "number"
                },
                "currency": {
                  "$ref": "#/domains/Generic/types/CurrencyCode"
                }
              }
            }
          }
        },
        "GuestData": {
          "type": "object",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            },
            "email": {
              "type": "string",
              "description": "Email address used for contact.",
              "format": "email",
              "example": "client@example.com"
            },
            "phone": {
              "type": "string"
            }
          },
          "required": [
            "firstName",
            "lastName",
            "email",
            "phone"
          ],
          "additionalProperties": false
        },
        "RoomOccupancy": {
          "type": "array",
          "description": "A list of rooms with guests occupancy",
          "minItems": 1,
          "pii": true,
          "items": {
            "$ref": "#/domains/HotelBookingBG/types/RoomOccupants"
          }
        },
        "RoomOccupants": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "guestFirstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "guestLastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            },
            "occupancy": {
              "$ref": "#/domains/HotelBookingBG/types/Occupancy"
            }
          },
          "required": [
            "guestFirstName",
            "guestLastName"
          ],
          "additionalProperties": false
        },
        "Occupancy": {
          "type": "object",
          "properties": {
            "adults": {
              "type": "number"
            },
            "childAges": {
              "type": "array",
              "items": {
                "type": "number",
                "minimum": 0,
                "maximum": 150,
                "exmaple": 10
              }
            }
          }
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "confirmationNumber": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            }
          },
          "additionalProperties": false,
          "required": [
            "confirmationNumber"
          ]
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "value": {
              "type": "number"
            },
            "currency": {
              "$ref": "#/domains/Generic/types/CurrencyCode"
            },
            "countryCode": {
              "type": "string"
            },
            "stateCode": {
              "type": "string"
            },
            "postcode": {
              "type": "string"
            },
            "houseNumber": {
              "type": "string"
            },
            "street": {
              "type": "string"
            },
            "type": {
              "type": "string",
              "enum": [
                "Card",
                "TokenizedCard"
              ]
            },
            "cardHolderName": {
              "type": "string"
            },
            "cardType": {
              "type": "string",
              "enum": [
                "debit",
                "credit"
              ]
            },
            "cvv": {
              "type": "string",
              "description": "Security code written on card, 3- or 4-digit number.",
              "example": "123",
              "minLength": 3,
              "maxLength": 4
            },
            "expiresMonth": {
              "type": "number",
              "minLength": 1,
              "maxLength": 2,
              "description": "Card expiration month between 1 and 12"
            },
            "expiresYear": {
              "type": "number",
              "pattern": "^20[0-9]{2}$",
              "minLength": 4,
              "maxLength": 4,
              "description": "Card expiration year 4 digit"
            },
            "callbackUrls": {
              "type": "object",
              "properties": {
                "successUrl": {
                  "type": "string"
                },
                "failedUrl": {
                  "type": "string"
                },
                "cancelUrl": {
                  "type": "string"
                }
              }
            },
            "fraudDetectionToken": {
              "type": "string"
            },
            "clientIp": {
              "type": "string"
            }
          },
          "required": [
            "cardType",
            "cardHolderName",
            "cvv",
            "expiresMonth",
            "expiresYear"
          ],
          "additionalProperties": true
        },
        "Boolean": {
          "type": "boolean"
        }
      },
      "errors": [
        {
          "code": "RoomNotAvailable",
          "category": "client",
          "description": "The website claims the room is not available for the selected dates."
        },
        {
          "code": "MultipleRoomsRequired",
          "category": "client",
          "description": "Multiple rooms required for the requested amount of guests."
        },
        {
          "code": "MinimumStayRequired",
          "category": "client",
          "description": "The minimum stay requirement is not met."
        },
        {
          "code": "GuestDetailsInvalid",
          "category": "client",
          "description": "The guest details are invalid."
        },
        {
          "code": "DuplicateBooking",
          "category": "client",
          "description": "The website claims that there is another booking with the same details"
        }
      ]
    },
    "HotelBookingExtraction": {
      "description": "Internal domain for generating HotelBooking inputs.",
      "private": true,
      "inputs": {
        "options": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Options",
          "default": {},
          "initial": true
        },
        "selectedDestination": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Destination",
          "sourceOutputKey": "availableDestinations",
          "inputMethod": "SelectOne"
        },
        "checkinDate": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Date"
        },
        "checkoutDate": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Date"
        },
        "selectedHotel": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Hotel",
          "sourceOutputKey": "availableHotels",
          "inputMethod": "SelectOne"
        },
        "guestAges": {
          "typeRef": "#/domains/Generic/types/Ages"
        }
      },
      "outputs": {
        "search": {
          "typeRef": "#/domains/HotelBooking/types/Search"
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page."
        },
        "availableDestinations": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Destinations"
        },
        "availableHotels": {
          "typeRef": "#/domains/HotelBookingExtraction/types/Hotels"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "searchRates": {
              "type": "boolean",
              "description": "If <code>true</code>, enables special rates output and input at search.",
              "default": false
            }
          }
        },
        "Destination": {
          "type": "string",
          "minLength": 3
        },
        "Destinations": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelBookingExtraction/types/Destination"
          }
        },
        "Hotel": {
          "type": "string",
          "minLength": 3
        },
        "Hotels": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelBookingExtraction/types/Hotel"
          }
        },
        "Date": {
          "type": "string",
          "format": "date",
          "description": "Date (hotel local date).",
          "example": "2019-01-01"
        }
      },
      "errors": []
    },
    "HotelContent": {
      "description": "Enables scraping hotel details.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "search": {
          "typeRef": "#/domains/HotelContent/types/String",
          "description": "Search string."
        },
        "identifier": {
          "typeRef": "#/domains/HotelContent/types/String",
          "description": "Hotel identifier."
        },
        "originalName": {
          "typeRef": "#/domains/HotelContent/types/String",
          "description": "Hotel name (best effort)."
        },
        "coords": {
          "typeRef": "#/domains/HotelContent/types/Coords",
          "description": "Hotel coordinates as lat long."
        },
        "address": {
          "typeRef": "#/domains/HotelContent/types/Address",
          "description": "Hotel address (best effort)."
        }
      },
      "outputs": {
        "additionalUrls": {
          "typeRef": "#/domains/HotelContent/types/AdditionalUrl",
          "description": "Additional URLs."
        },
        "addressMatch": {
          "typeRef": "#/domains/HotelContent/types/AddressMatch",
          "description": "Address match."
        },
        "descriptions": {
          "typeRef": "#/domains/HotelContent/types/Description",
          "description": "Description data."
        },
        "features": {
          "typeRef": "#/domains/HotelContent/types/Features",
          "description": "List of features."
        },
        "hotelId": {
          "typeRef": "#/domains/HotelContent/types/String",
          "description": "Identifier."
        },
        "hotelName": {
          "typeRef": "#/domains/HotelContent/types/NameMatch",
          "description": "Name match."
        },
        "master-data": {
          "typeRef": "#/domains/HotelContent/types/MasterData",
          "description": "Master data."
        },
        "ratings": {
          "typeRef": "#/domains/HotelContent/types/Ratings",
          "description": "Ratings summary."
        },
        "reviews": {
          "typeRef": "#/domains/HotelContent/types/Reviews",
          "description": "List of reviews."
        },
        "advertisers": {
          "typeRef": "#/domains/HotelContent/types/Advertisers",
          "description": "List of advertisers."
        }
      },
      "types": {
        "String": {
          "type": "string",
          "description": "Any string",
          "example": "Abc123#"
        },
        "Coords": {
          "type": "object",
          "properties": {
            "lat": {
              "type": "string"
            },
            "long": {
              "type": "string"
            }
          },
          "required": [
            "lat",
            "long"
          ],
          "additionalProperties": false
        },
        "Address": {
          "type": "object",
          "properties": {
            "line1": {
              "type": "string"
            },
            "city": {
              "type": "string"
            },
            "postcode": {
              "type": "string"
            }
          },
          "required": [
            "line1",
            "city"
          ],
          "additionalProperties": false
        },
        "AdditionalUrl": {
          "type": "object",
          "properties": {
            "sourced_url": {
              "$ref": "#/domains/Generic/types/URL"
            },
            "extracted_ta_url": {
              "$ref": "#/domains/Generic/types/URL"
            },
            "ibe_link": {
              "$ref": "#/domains/Generic/types/URL"
            }
          },
          "required": [
            "sourced_url"
          ],
          "additionalProperties": false
        },
        "AddressMatch": {
          "type": "object",
          "properties": {
            "match": {
              "type": "boolean"
            },
            "input": {
              "type": "object",
              "properties": {
                "address": {
                  "$ref": "#/domains/HotelContent/types/Address"
                },
                "coords": {
                  "$ref": "#/domains/HotelContent/types/Coords"
                }
              },
              "required": [
                "address",
                "coords"
              ],
              "additionalProperties": false
            },
            "output": {
              "type": "object",
              "properties": {
                "address": {
                  "type": "string"
                }
              },
              "required": [
                "address"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "match",
            "input",
            "output"
          ],
          "additionalProperties": false
        },
        "Description": {
          "type": "object",
          "properties": {
            "body": {
              "type": "string"
            }
          },
          "required": [
            "body"
          ],
          "additionalProperties": false
        },
        "Features": {
          "type": "object",
          "properties": {
            "facilities": {
              "$ref": "#/domains/HotelContent/types/Facilities"
            }
          },
          "required": [
            "facilities"
          ],
          "additionalProperties": false
        },
        "Facilities": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelContent/types/Facility"
          }
        },
        "Facility": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "available": {
              "type": "boolean"
            },
            "subtype": {
              "type": "string"
            }
          },
          "required": [
            "type",
            "available",
            "subtype"
          ],
          "additionalProperties": false
        },
        "NameMatch": {
          "type": "object",
          "properties": {
            "match": {
              "type": "boolean"
            },
            "input": {
              "type": "string"
            },
            "output": {
              "type": "string"
            }
          },
          "required": [
            "match",
            "input",
            "output"
          ],
          "additionalProperties": false
        },
        "MasterData": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "address": {
              "$ref": "#/domains/HotelContent/types/Explicit_Address"
            },
            "phone": {
              "type": "string"
            },
            "accommodation_type": {
              "type": "string"
            },
            "homepage_url": {
              "type": "string"
            },
            "star_rating": {
              "type": "object",
              "properties": {
                "star": {
                  "type": "number"
                }
              },
              "required": [
                "star"
              ],
              "additionalProperties": false
            },
            "styles": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "check_in_time": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "string"
                }
              },
              "required": [
                "from"
              ],
              "additionalProperties": false
            },
            "check_out_time": {
              "type": "object",
              "properties": {
                "until": {
                  "type": "string"
                }
              },
              "required": [
                "until"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "name",
            "address"
          ],
          "additionalProperties": false
        },
        "Explicit_Address": {
          "type": "object",
          "properties": {
            "street_1": {
              "type": "string",
              "minLength": 1
            },
            "street_2": {
              "type": "string",
              "minLength": 1
            },
            "postal_code": {
              "type": "string",
              "minLength": 1
            },
            "city": {
              "type": "string",
              "minLength": 1
            },
            "state": {
              "type": "string",
              "minLength": 1
            },
            "country": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "street_1"
          ],
          "additionalProperties": false
        },
        "Ratings": {
          "type": "object",
          "properties": {
            "rating": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "number"
                },
                "max": {
                  "type": "number"
                }
              },
              "required": [
                "value",
                "max"
              ],
              "additionalProperties": false
            },
            "rating_based_on": {
              "type": "integer"
            },
            "review_mention_ratings": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "sentiment": {
                    "type": "object",
                    "properties": {
                      "overall": {
                        "type": "string"
                      },
                      "negative": {
                        "type": "integer"
                      },
                      "positive": {
                        "type": "integer"
                      }
                    },
                    "required": [
                      "overall",
                      "negative",
                      "positive"
                    ],
                    "additionalProperties": false
                  },
                  "mentions": {
                    "type": "integer"
                  }
                },
                "required": [
                  "name",
                  "sentiment",
                  "mentions"
                ],
                "additionalProperties": false
              }
            },
            "aspect_ratings": {
              "$ref": "#/domains/HotelContent/types/AspectRatings"
            }
          },
          "required": [
            "rating",
            "rating_based_on"
          ],
          "additionalProperties": false
        },
        "Reviews": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelContent/types/Review"
          }
        },
        "Review": {
          "type": "object",
          "properties": {
            "title": {
              "type": "string"
            },
            "author": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "additionalProperties": false
            },
            "stats": {
              "type": "object",
              "properties": {
                "normalized_rating": {
                  "type": "integer"
                },
                "sentiment": {
                  "type": "string"
                }
              },
              "required": [
                "normalized_rating",
                "sentiment"
              ],
              "additionalProperties": false
            },
            "body": {
              "type": "string"
            },
            "aspect_ratings": {
              "$ref": "#/domains/HotelContent/types/AspectRatings"
            },
            "hotelier_answer": {
              "type": "string",
              "minLength": 1
            },
            "traits": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "trip": {
              "type": "object",
              "properties": {
                "day": {
                  "type": "integer"
                },
                "month": {
                  "type": "integer"
                },
                "year": {
                  "type": "integer"
                },
                "duration": {
                  "type": "integer"
                },
                "type": {
                  "type": "string"
                },
                "with": {
                  "type": "string"
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "body"
          ],
          "additionalProperties": false
        },
        "AspectRatings": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "rating": {
                "type": "object",
                "properties": {
                  "min": {
                    "type": "number"
                  },
                  "max": {
                    "type": "number"
                  },
                  "value": {
                    "type": "number"
                  }
                },
                "required": [
                  "max",
                  "value"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "name",
              "rating"
            ],
            "additionalProperties": false
          }
        },
        "Advertisers": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelContent/types/Advertiser"
          }
        },
        "Advertiser": {
          "type": "object",
          "properties": {
            "advertiser": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "advertiser",
            "price"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "HotelNotFound",
          "category": "server",
          "description": "Could not find the hotel"
        },
        {
          "code": "DecoratePageFailed",
          "category": "server",
          "description": "Could not decorate the page"
        },
        {
          "code": "RedirectFailed",
          "category": "server",
          "description": "Could not navigate"
        }
      ]
    },
    "HotelLoyaltiesSignup": {
      "description": "Allows creating accounts for hotel loyalties programmes.",
      "private": false,
      "successCode": {
        "outputKey": "accountConfirmation",
        "valuePath": "/number"
      },
      "inputs": {
        "options": {
          "typeRef": "#/domains/HotelLoyaltiesSignup/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either login page or further down the funnel.",
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/HotelLoyaltiesSignup/types/Account"
        },
        "selectedMarketingOptions": {
          "typeRef": "#/domains/HotelLoyaltiesSignup/types/SelectedItem",
          "description": "List of marketing options to be selected.",
          "sourceOutputKey": "availableMarketingOptions",
          "inputMethod": "SelectMany"
        }
      },
      "outputs": {
        "availableMarketingOptions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems",
          "description": "List of marketing options provided by the hotel."
        },
        "accountTermsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when account T&Cs are presented."
        },
        "accountConfirmation": {
          "typeRef": "#/domains/HotelLoyaltiesSignup/types/Confirmation"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end."
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \"Account creation success\" page.",
          "properties": {
            "number": {
              "type": "string",
              "description": "Loyalty number grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful member account creation."
            }
          },
          "additionalProperties": false,
          "required": []
        },
        "Account": {
          "type": "object",
          "properties": {
            "person": {
              "$ref": "#/domains/HotelLoyaltiesSignup/types/Person"
            },
            "address": {
              "type": "object",
              "$ref": "#/domains/HotelLoyaltiesSignup/types/ExplicitAddress"
            },
            "contact": {
              "type": "object",
              "properties": {
                "email": {
                  "type": "string",
                  "description": "Applicant email, typically used for contact details.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully.",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "description": "Phone number, may also be used as contact details.",
                  "$ref": "#/domains/Generic/types/Phone"
                }
              },
              "required": [],
              "additionalProperties": false
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            }
          },
          "required": [
            "person",
            "contact",
            "password"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "",
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "gender": {
              "type": "string",
              "description": "",
              "enum": [
                "male",
                "female"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "ExplicitAddress": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Street name without number.",
              "example": "Twin Peaks Blv"
            },
            "streetNumberOrHouseName": {
              "type": "string",
              "description": "Street number or house name.",
              "example": "Buckingham Palace"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "example": "San Francisco"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/ElectronicTravelAuthorisation/types/CountryCodeOrEmptyString"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "SelectedItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "errors": []
    },
    "HotelPriceCrawling": {
      "description": "Enables crawling hotel prices.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "previousResults": {
          "typeRef": "#/domains/HotelPriceCrawling/types/Results",
          "description": "The list of available rooms with rates."
        },
        "searches": {
          "typeRef": "#/domains/HotelPriceCrawling/types/Searches"
        }
      },
      "outputs": {
        "hotel": {
          "typeRef": "#/domains/HotelPriceCrawling/types/Hotel",
          "description": "Hotel details as claimed by the website."
        },
        "ageThreshold": {
          "typeRef": "#/domains/HotelPriceCrawling/types/Integer",
          "description": "The threshold which differentiates child guests from adult guests. This value is right bounded (the threshold itself belongs to the child category)."
        },
        "results": {
          "typeRef": "#/domains/HotelPriceCrawling/types/Results",
          "description": "The list of available rooms with rates."
        },
        "pointOfSale": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "The list of available rooms with rates."
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {},
          "additionalProperties": false
        },
        "Results": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelPriceCrawling/types/ResultItem"
          }
        },
        "ResultItem": {
          "type": "object",
          "properties": {
            "search": {
              "$ref": "#/domains/HotelPriceCrawling/types/Search"
            },
            "result": {
              "$ref": "#/domains/HotelPriceCrawling/types/Result"
            }
          },
          "required": [
            "search",
            "result"
          ],
          "additionalProperties": false
        },
        "Result": {
          "type": "object",
          "properties": {
            "estimated": {
              "type": "boolean"
            },
            "crawledAt": {
              "type": "integer"
            },
            "rooms": {
              "$ref": "#/domains/HotelPriceCrawling/types/Rooms"
            }
          },
          "required": [
            "estimated",
            "crawledAt",
            "rooms"
          ],
          "additionalProperties": false
        },
        "Rooms": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelPriceCrawling/types/Room"
          }
        },
        "Room": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 200,
              "description": "The name of the room, as presented to users."
            },
            "id": {
              "type": "string",
              "description": "A room identifier, unique per hotel"
            },
            "description": {
              "type": "string"
            },
            "capacity": {
              "type": "integer",
              "description": "The maximum number of guests that a room can physically accommodate."
            },
            "occupancy": {
              "type": "integer",
              "description": "The maximum number of guests that a room is intended for."
            },
            "images": {
              "type": "array",
              "minItems": 0,
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            },
            "rates": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/HotelPriceCrawling/types/Rate"
              }
            },
            "canBeShared": {
              "type": "boolean"
            },
            "beds": {
              "type": "array",
              "description": "Type(s) of the beds.",
              "minItems": 0,
              "items": {
                "type": "string",
                "enum": [
                  "single",
                  "double",
                  "semi-double",
                  "queen",
                  "king",
                  "unknown"
                ]
              }
            },
            "style": {
              "type": "string",
              "description": "Style of room for hotels.",
              "enum": [
                "japanese",
                "western",
                "japanese-western"
              ]
            },
            "smoking": {
              "type": "boolean"
            },
            "openAirBath": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "name",
            "rates"
          ],
          "additionalProperties": false
        },
        "Rate": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "maxLength": 200,
              "description": "The name of the rate, as presented to users."
            },
            "id": {
              "type": "string",
              "description": "A rate identifier, unique per hotel"
            },
            "rule": {
              "type": "string",
              "description": "A rate rule ID, e.g. 'member' or 'mobile'"
            },
            "description": {
              "type": "string"
            },
            "occupancy": {
              "type": "integer",
              "description": "The number of guests that the rate is intended for."
            },
            "mealPlan": {
              "type": "string",
              "enum": [
                "room-only",
                "breakfast",
                "half-board",
                "full-board",
                "all-inclusive"
              ]
            },
            "breakfastIncluded": {
              "type": "boolean"
            },
            "lunchIncluded": {
              "type": "boolean"
            },
            "dinnerIncluded": {
              "type": "boolean"
            },
            "allInclusive": {
              "type": "boolean"
            },
            "parkingIncluded": {
              "type": "boolean"
            },
            "internetIncluded": {
              "type": "boolean"
            },
            "refundable": {
              "$ref": "#/domains/HotelPriceCrawling/types/Refundable"
            },
            "baseRate": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "taxes": {
              "type": "array",
              "minItems": 0,
              "items": {
                "$ref": "#/domains/HotelPriceCrawling/types/Tax"
              }
            },
            "isShared": {
              "type": "boolean"
            },
            "checkInTime": {
              "type": "string",
              "description": "String in the format HH:mm",
              "example": "16:30"
            },
            "checkOutTime": {
              "type": "string",
              "description": "String in the format HH:mm",
              "example": "16:30"
            }
          },
          "required": [
            "id",
            "name",
            "baseRate",
            "taxes"
          ],
          "additionalProperties": false
        },
        "Tax": {
          "type": "object",
          "properties": {
            "type": {
              "enum": [
                "NamedPrice"
              ]
            },
            "code": {
              "type": "string",
              "description": "The code inferred based on the name.",
              "enum": [
                "city-tax",
                "vat",
                "hotel-fee",
                "resort-fee",
                "service-fee",
                "booking-fee",
                "other-taxes",
                "other-fees",
                "other"
              ]
            },
            "name": {
              "type": "string",
              "description": "The name or title of the price."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name",
            "price"
          ],
          "additionalProperties": false
        },
        "Refundable": {
          "type": "object",
          "description": "Describes the refund policy available and its deadlines.",
          "properties": {
            "available": {
              "type": "boolean",
              "description": "A boolean indicating if refund is available or not."
            },
            "untilDate": {
              "type": "string",
              "description": "String date in yyyy-MM-dd format that indicates until which date refund is available. Is not be present if available is false.",
              "example": "2023-01-01"
            },
            "untilTime": {
              "type": "string",
              "description": "String in the format HH:mm representing the hour until which refund is available. Is not be present if available is false.",
              "example": "16:30"
            }
          },
          "required": [
            "available"
          ],
          "additionalProperties": false
        },
        "Hotel": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "A identifier, unique per hotel"
            },
            "name": {
              "type": "string",
              "maxLength": 200,
              "description": "Name of the hotel."
            },
            "language": {
              "type": "string",
              "description": "Default hotel language."
            },
            "currency": {
              "type": "string",
              "description": "Default hotel currency."
            },
            "address": {
              "type": "string",
              "description": "Hotel address."
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "String": {
          "type": "string"
        },
        "Integer": {
          "type": "integer"
        },
        "Searches": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelPriceCrawling/types/Search"
          }
        },
        "Search": {
          "type": "object",
          "properties": {
            "hotelId": {
              "type": "string",
              "description": "A identifier, unique per hotel"
            },
            "checkIn": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "nights": {
              "type": "integer"
            },
            "guests": {
              "type": "integer"
            }
          },
          "required": [
            "hotelId",
            "checkIn",
            "nights"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "RoomsNotAvailable",
          "category": "client",
          "description": "The website claims the room is not available for the search criteria."
        },
        {
          "code": "ChildrenCountNotSupported",
          "category": "client",
          "description": "The requested number of children is not supported by any room at this hotel."
        },
        {
          "code": "AdultsCountNotSupported",
          "category": "client",
          "description": "The requested number of adults is not supported by any room at this hotel."
        },
        {
          "code": "HotelNotOnIbe",
          "category": "client",
          "description": "The hotel was not found on the IBE."
        }
      ]
    },
    "HotelRoomBooking": {
      "description": "Enables booking hotel rooms.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "search": {
          "typeRef": "#/domains/HotelRoomBooking/types/Search"
        },
        "selectedRooms": {
          "typeRef": "#/domains/HotelRoomBooking/types/Rooms",
          "description": "List of rooms to be booked in one go. Depending on the supplier, only one item may be allowed.",
          "inputMethod": "SelectMany"
        },
        "roomId": {
          "typeRef": "#/domains/HotelRoomBooking/types/String",
          "description": "Identifier of the room to be booked."
        },
        "rateId": {
          "typeRef": "#/domains/HotelRoomBooking/types/String",
          "description": "Identifier of the rate to be booked."
        },
        "mainGuest": {
          "typeRef": "#/domains/HotelRoomBooking/types/MainGuest",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/person",
            "/contact/email"
          ]
        },
        "payment": {
          "typeRef": "#/domains/HotelRoomBooking/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "options": {
          "typeRef": "#/domains/HotelRoomBooking/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "priceBreakdown": {
          "typeRef": "#/domains/HotelRoomBooking/types/PriceBreakdown",
          "description": "Total price breakdown."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/HotelRoomBooking/types/BookingConfirmation"
        },
        "bookingTermsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when booking T&Cs are presented."
        },
        "supportedCards": {
          "typeRef": "#/domains/HotelRoomBooking/types/SupportedCards",
          "description": "List of card brands and types found on the supplier's website."
        },
        "privacyPolicy": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the privacy policy is presented."
        }
      },
      "types": {
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "Search": {
          "type": "object",
          "properties": {
            "hotelId": {
              "type": "string",
              "description": "UBIO hotel identifier"
            },
            "checkIn": {
              "type": "string",
              "format": "date",
              "example": "2023-06-27"
            },
            "nights": {
              "type": "integer",
              "example": 2
            },
            "guests": {
              "type": "integer",
              "example": 2
            }
          },
          "required": [
            "hotelId",
            "checkIn",
            "nights",
            "guests"
          ],
          "additionalProperties": false
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "person": {
              "$ref": "#/domains/HotelRoomBooking/types/Person"
            },
            "address": {
              "$ref": "#/domains/HotelRoomBooking/types/Address"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "ExplicitAddress": {
          "type": "object",
          "description": "Explicit address components (parsed version, used to format into various standards).",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Name of the street.",
              "minLength": 1,
              "example": "Clerkenwell Close"
            },
            "streetNumber": {
              "type": "string",
              "description": "Number of the street or other building identifier, such as house number or house name",
              "minLength": 1,
              "example": "27-31"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "minLength": 1,
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "InlinedAddress": {
          "type": "object",
          "description": "Address components common to inlined addresses (line1, line2)",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "minLength": 1,
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Address": {
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            },
            {
              "$ref": "#/domains/Generic/types/InlinedAddress"
            }
          ]
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "phone": {
              "$ref": "#/domains/Generic/types/AnyPhoneString"
            },
            "email": {
              "type": "string",
              "description": "Email address used for contact.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/HotelRoomBooking/types/Person"
            },
            "contact": {
              "$ref": "#/domains/HotelRoomBooking/types/GuestContact"
            }
          },
          "required": [
            "person",
            "contact"
          ],
          "additionalProperties": false
        },
        "String": {
          "type": "string"
        },
        "Rooms": {
          "type": "array",
          "description": "A list of rooms.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/HotelRoomBooking/types/Room"
          }
        },
        "Room": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "example": "Standard Single Room"
            },
            "name": {
              "type": "string",
              "example": "Room with Window"
            },
            "rate": {
              "type": "string",
              "example": "Breakfast Plus"
            },
            "description": {
              "$ref": "#/domains/HotelRoomBooking/types/RoomDescription"
            },
            "rateDescription": {
              "$ref": "#/domains/HotelRoomBooking/types/RoomDescription"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            },
            "strikePrice": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 30600,
                "currency": "gbp"
              }
            },
            "priceLines": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelRoomBooking/types/PriceLineItem"
              }
            },
            "cancellation": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "full-refundable",
                    "flexible-refundable",
                    "non-refundable",
                    "unknown"
                  ]
                },
                "details": {
                  "$ref": "#/domains/Generic/types/StructuredTextItem",
                  "example": {
                    "type": "Text",
                    "text": "Free cancellation up to 24h before. Cancellation not allowed afterwards."
                  }
                }
              },
              "required": [
                "code"
              ],
              "additionalProperties": false
            },
            "valueAdditions": {
              "type": "array",
              "items": {
                "$ref": "#/domains/HotelRoomBooking/types/ValueAddition"
              }
            },
            "occupancy": {
              "type": "object",
              "properties": {
                "adults": {
                  "type": "number"
                },
                "children": {
                  "type": "number"
                },
                "infants": {
                  "type": "number"
                }
              },
              "required": [
                "adults"
              ],
              "additionalProperties": false
            },
            "rateGroup": {
              "type": "string",
              "example": "standard"
            },
            "isMemberRate": {
              "type": "boolean",
              "example": true
            },
            "images": {
              "type": "array",
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "ValueAddition": {
          "type": "string",
          "enum": [
            "pay-later",
            "free-breakfast",
            "free-half-board",
            "free-full-board",
            "free-all-inclusive",
            "free-parking",
            "free-internet"
          ]
        },
        "RoomDescription": {
          "type": "array",
          "description": "A list to describe a room or a rate.",
          "minItems": 0,
          "items": {
            "type": "string",
            "example": "Maximum occupancy: 2"
          }
        },
        "PriceLineItem": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "net-rate",
                "city-tax",
                "vat",
                "hotel-fee",
                "resort-fee",
                "service-fee",
                "booking-fee",
                "total-now",
                "total-later",
                "total-later-supplier",
                "total-overall",
                "total-overall-supplier",
                "others"
              ]
            },
            "paidAtHotel": {
              "type": "boolean"
            },
            "excludedFromTotals": {
              "type": "boolean"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            }
          },
          "required": [
            "type",
            "description",
            "price"
          ],
          "additionalProperties": false
        },
        "PriceBreakdown": {
          "type": "array",
          "items": {
            "$ref": "#/domains/HotelRoomBooking/types/PriceLineItem"
          }
        },
        "SupportedCards": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/HotelRoomBooking/types/CardBrandType"
          }
        },
        "CardBrandType": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "description": "Card type, debit or credit.",
              "enum": [
                "debit",
                "credit",
                "prepaid"
              ]
            },
            "brand": {
              "type": "string",
              "description": "Card brand.",
              "enum": [
                "visa",
                "mastercard",
                "amex",
                "discover"
              ]
            }
          },
          "required": [
            "brand",
            "type"
          ],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "additionalProperties": true
        }
      },
      "errors": [
        {
          "code": "RoomNotAvailable",
          "category": "client",
          "description": "The website claims that the room is not available for the search criteria."
        },
        {
          "code": "DuplicateBooking",
          "category": "client",
          "description": "The website claims that there is another booking with the same details"
        }
      ]
    },
    "Internal": {
      "description": "Internal domain for testing platform features.",
      "private": true,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "options": {
          "typeRef": "#/domains/Internal/types/Options",
          "description": "Used by service-api tests.",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Used by most test services."
        },
        "dynamicInput": {
          "typeRef": "#/domains/Internal/types/Value",
          "description": "Used by test-stages service.",
          "dynamic": true
        },
        "password": {
          "typeRef": "#/domains/Internal/types/SomethingPrivate",
          "description": "Private/PII/Confidential."
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Used by test-price-consent service.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken",
          "description": "Used by test-pan-replacement service."
        }
      },
      "outputs": {
        "object": {
          "typeRef": "#/domains/Internal/types/Object"
        },
        "value": {
          "typeRef": "#/domains/Internal/types/Value"
        },
        "dynamicOutput": {
          "typeRef": "#/domains/Internal/types/Value",
          "description": "Used by test-stages service.",
          "dynamic": true
        },
        "finalPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Used by test-price-consent service."
        },
        "confirmation": {
          "typeRef": "#/domains/Internal/types/Confirmation"
        },
        "somethingPrivate": {
          "typeRef": "#/domains/Internal/types/SomethingPrivate"
        }
      },
      "types": {
        "Value": {
          "type": [
            "null",
            "string",
            "number",
            "boolean",
            "object",
            "array"
          ],
          "description": "An arbitrary value."
        },
        "Object": {
          "type": "object",
          "description": "An object of arbitrary structure."
        },
        "Array": {
          "type": "object",
          "description": "An array of arbitrary values.",
          "items": {
            "$ref": "#/domains/Internal/types/Value"
          }
        },
        "Options": {
          "type": "object",
          "description": "Flags for testing optional features.",
          "properties": {
            "flag": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on \" success\" page.",
          "properties": {
            "code": {
              "type": "string",
              "description": "reference grabbed from the page.",
              "example": "UBIO1234"
            },
            "message": {
              "type": "string",
              "description": "Message about successful automation.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the page."
            }
          },
          "additionalProperties": false,
          "required": [
            "code"
          ]
        },
        "SomethingPrivate": {
          "type": "string",
          "description": "I contain some PII.",
          "pii": true,
          "example": "N/A"
        }
      },
      "errors": [
        {
          "code": "InternalError",
          "category": "server",
          "description": "Internal error occurred"
        },
        {
          "code": "ClientError",
          "category": "client",
          "description": "Client caused error"
        }
      ]
    },
    "JobBoardApplication": {
      "description": "Allows automating applying for jobs.",
      "private": false,
      "inputs": {
        "options": {
          "typeRef": "#/domains/JobBoardApplication/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "applicant": {
          "typeRef": "#/domains/JobBoardApplication/types/Applicant"
        },
        "files": {
          "typeRef": "#/domains/JobBoardApplication/types/Files"
        },
        "submit": {
          "typeRef": "#/domains/JobBoardApplication/types/Submit"
        },
        "jobPostId": {
          "typeRef": "#/domains/JobBoardApplication/types/JobPostId"
        },
        "jobid": {
          "typeRef": "#/domains/JobBoardApplication/types/Jobid"
        },
        "applicationId": {
          "typeRef": "#/domains/JobBoardApplication/types/ApplicationId"
        },
        "selectedDynamicQuestions": {
          "typeRef": "#/domains/JobBoardApplication/types/SelectedDynamicQuestions",
          "dynamic": true
        },
        "conditionalDynamicQuestions": {
          "typeRef": "#/domains/JobBoardApplication/types/ConditionalDynamicQuestions",
          "dynamic": true
        },
        "client": {
          "typeRef": "#/domains/JobBoardApplication/types/Client"
        },
        "2FA": {
          "typeRef": "#/domains/Generic/types/Text",
          "description": "Applicant's two-factor authentication code.",
          "deleteOnRestart": true
        }
      },
      "outputs": {
        "resolvedUrl": {
          "typeRef": "#/domains/JobBoardApplication/types/ResolvedUrl"
        },
        "triggerProxyEmail": {
          "typeRef": "#/domains/JobBoardApplication/types/TriggerProxyEmail"
        },
        "serviceData": {
          "typeRef": "#/domains/JobBoardApplication/types/ServiceData"
        },
        "cookies": {
          "typeRef": "#/domains/Generic/types/Cookies"
        },
        "availableDynamicQuestions": {
          "typeRef": "#/domains/JobBoardApplication/types/AvailableDynamicQuestions",
          "dynamic": true
        },
        "review": {
          "typeRef": "#/domains/JobBoardApplication/types/Review"
        },
        "successfulApplication": {
          "typeRef": "#/domains/JobBoardApplication/types/SuccessfulApplication"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features like seat selection. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "mineQuestions": {
              "type": "boolean",
              "description": "If <code>true</code>, automation will mine the questions instead of applying.",
              "default": false
            }
          }
        },
        "Applicant": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "person": {
              "type": "object",
              "properties": {
                "firstName": {
                  "type": "string",
                  "description": "First name(s) or given name(s), as specified in ID.",
                  "minLength": 1,
                  "example": "Bob"
                },
                "middleName": {
                  "type": "string",
                  "default": "",
                  "description": "Middlnpme name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
                },
                "lastName": {
                  "type": "string",
                  "description": "Last name or surname, as specified in ID.",
                  "minLength": 1,
                  "example": "Smith"
                }
              },
              "required": [
                "firstName",
                "lastName"
              ]
            }
          },
          "additionalProperties": false
        },
        "ResolvedUrl": {
          "type": "object",
          "description": "",
          "properties": {
            "domain": {
              "type": "string",
              "description": ""
            },
            "url": {
              "type": "string",
              "description": ""
            }
          },
          "required": [
            "domain",
            "url"
          ],
          "additionalProperties": false
        },
        "TriggerProxyEmail": {
          "type": "string",
          "description": "The email address used for proxy email.",
          "additionalProperties": false
        },
        "ServiceData": {
          "type": "object",
          "description": "The service data.",
          "properties": {
            "domain": {
              "type": "string",
              "description": ""
            },
            "serviceId": {
              "type": "string",
              "description": ""
            },
            "url": {
              "type": "string",
              "description": ""
            }
          },
          "required": [
            "domain",
            "serviceId",
            "url"
          ],
          "additionalProperties": false
        },
        "Files": {
          "type": "object",
          "pii": true,
          "properties": {
            "cv": {
              "typeRef": "#/domains/Generic/types/File",
              "description": "A file containing the CV"
            }
          },
          "required": [
            "cv"
          ],
          "additionalProperties": false
        },
        "JobPostId": {
          "type": "string",
          "description": "The ID of the job post to apply for.",
          "additionalProperties": false
        },
        "Jobid": {
          "type": "string",
          "description": "The ID of the job post to apply for.",
          "additionalProperties": false
        },
        "ApplicationId": {
          "type": "string",
          "description": "The ID of the application.",
          "additionalProperties": false
        },
        "Submit": {
          "type": "boolean",
          "pii": false,
          "additionalProperties": false
        },
        "ConditionalDynamicQuestions": {
          "type": "array",
          "items": {
            "$ref": "#/domains/JobBoardApplication/types/ConditionalDynamicQuestion"
          }
        },
        "ConditionalDynamicQuestion": {
          "type": "object",
          "properties": {
            "sourceQuestion": {
              "$ref": "#/domains/JobBoardApplication/types/AvailableDynamicQuestion"
            },
            "triggerAnswer": {
              "$ref": "#/domains/JobBoardApplication/types/SelectedDynamicQuestion"
            },
            "conditionalQuestion": {
              "$ref": "#/domains/JobBoardApplication/types/AvailableDynamicQuestion"
            }
          },
          "required": [
            "sourceQuestion",
            "triggerAnswer",
            "conditionalQuestion"
          ],
          "additionalProperties": false
        },
        "SelectedDynamicQuestions": {
          "type": "array",
          "description": "Additional options to fill in.",
          "items": {
            "$ref": "#/domains/JobBoardApplication/types/SelectedDynamicQuestion"
          }
        },
        "SelectedDynamicQuestion": {
          "anyOf": [
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionText"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionTextArea"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionSelectOne"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionSelectMultiple"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionBoolean"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionDate"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionArrayOfObjects"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionFragmentedQuestion"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/SelectedQuestionFile"
            }
          ]
        },
        "SelectedQuestionText": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Text"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionTextArea": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "TextArea"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionSelectMultiple": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMultiple"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Boolean"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "boolean"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionDate": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Date"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9])$",
              "description": "Date and time.",
              "example": "2018-02-02 19:40"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionArrayOfObjects": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "ArrayOfObjects"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "array",
              "items": {
                "$ref": "#/domains/JobBoardApplication/types/SelectedDynamicQuestions"
              }
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "SelectedQuestionFragmentedQuestion": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "FragmentedQuestion"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "$ref": "#/domains/JobBoardApplication/types/SelectedDynamicQuestions"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ]
        },
        "SelectedQuestionFile": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "File"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "typeRef": "#/domains/Generic/types/File"
            },
            "mandatory": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "value"
          ],
          "additionalProperties": false
        },
        "AvailableDynamicQuestions": {
          "type": "array",
          "description": "Additional options to fill in.",
          "items": {
            "$ref": "#/domains/JobBoardApplication/types/AvailableDynamicQuestion"
          }
        },
        "AvailableDynamicQuestion": {
          "anyOf": [
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionText"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextArea"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectOne"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectMultiple"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionBoolean"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionDate"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionArrayOfObjects"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFragmentedQuestion"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextLiteral"
            },
            {
              "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFile"
            }
          ]
        },
        "AvailableQuestionText": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Text"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionTextArea": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "TextArea"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "description": "A list of available options.",
              "items": {
                "type": "object",
                "properties": {
                  "answer": {
                    "type": "string"
                  },
                  "conditionalQuestions": {
                    "type": "array",
                    "items": {
                      "anyOf": [
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionText"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextArea"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectOne"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectMultiple"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionBoolean"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionDate"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionArrayOfObjects"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextLiteral"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFile"
                        }
                      ]
                    }
                  }
                },
                "example": "example"
              }
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "options",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionSelectMultiple": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMultiple"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "description": "A list of available options.",
              "items": {
                "type": "object",
                "properties": {
                  "answer": {
                    "type": "string"
                  },
                  "conditionalQuestions": {
                    "type": "array",
                    "items": {
                      "anyOf": [
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionText"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextArea"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectOne"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectMultiple"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionBoolean"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionDate"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionArrayOfObjects"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextLiteral"
                        },
                        {
                          "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFile"
                        }
                      ]
                    }
                  }
                }
              }
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "options",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Boolean"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "value": {
              "type": "string"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionDate": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Date"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionArrayOfObjects": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "ArrayOfObjects"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionText"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextArea"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectOne"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectMultiple"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionBoolean"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionDate"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionArrayOfObjects"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextLiteral"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFile"
                  }
                ]
              }
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionFragmentedQuestion": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "FragmentedQuestion"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "options": {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionText"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextArea"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectOne"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionSelectMultiple"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionBoolean"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionDate"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionArrayOfObjects"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionTextLiteral"
                  },
                  {
                    "$ref": "#/domains/JobBoardApplication/types/AvailableQuestionFile"
                  }
                ]
              }
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionTextLiteral": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "TextLiteral"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "value": {
              "type": "string"
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "value",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "AvailableQuestionFile": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "File"
              ]
            },
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "question": {
              "type": "string"
            },
            "accept": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "mandatory": {
              "type": "boolean"
            },
            "ignoreCache": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "id",
            "label",
            "question",
            "accept",
            "mandatory"
          ],
          "additionalProperties": false
        },
        "Review": {
          "type": "boolean"
        },
        "SuccessfulApplication": {
          "type": "object",
          "properties": {
            "message": {
              "type": "string"
            }
          },
          "required": [
            "message"
          ],
          "additionalProperties": false
        },
        "Client": {
          "type": "object",
          "properties": {
            "clientId": {
              "type": "string"
            },
            "jobPostId": {
              "type": "string"
            },
            "clientName": {
              "type": "string"
            },
            "employer": {
              "type": "string"
            },
            "jobTitle": {
              "type": "string"
            },
            "country": {
              "$ref": "#/domains/Generic/types/CountryCode"
            }
          },
          "required": [
            "clientId",
            "jobPostId"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "AlreadyApplied",
          "category": "client",
          "description": "An application has already been sent"
        },
        {
          "code": "ApplicantDetailsInvalid",
          "category": "client",
          "description": "Applicant details invalid"
        },
        {
          "code": "ApplicationFailed",
          "category": "client",
          "description": "Application process failed"
        },
        {
          "code": "AtsLookupError",
          "category": "client",
          "description": "An ATS Lookup failed to resolve the provided URL"
        },
        {
          "code": "FileFailedToUpload",
          "category": "website",
          "description": "File could not be uploaded"
        },
        {
          "code": "FileTypeNotSupported",
          "category": "client",
          "description": "File type not supported"
        },
        {
          "code": "InternalError",
          "category": "server",
          "description": "Something went wrong on our side"
        },
        {
          "code": "JobExpired",
          "category": "client",
          "description": "Job expired"
        },
        {
          "code": "JobNotFound",
          "category": "client",
          "description": "Job could not be found"
        },
        {
          "code": "MandatoryQuestionsNotAnswered",
          "category": "client",
          "description": "Mandatory questions must be answered"
        }
      ]
    },
    "LoanApplication": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "guarantorResidentialStatus": {
          "typeRef": "#/domains/LoanApplication/types/ResidentialStatus",
          "description": "Guarantor's residential status."
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "loan": {
          "typeRef": "#/domains/LoanApplication/types/Loan"
        },
        "existingApplication": {
          "typeRef": "#/domains/LoanApplication/types/OptionalExistingApplication"
        },
        "applicant": {
          "typeRef": "#/domains/LoanApplication/types/Applicant"
        },
        "loanConsent": {
          "typeRef": "#/domains/LoanApplication/types/Quote",
          "description": "Client's consent for the loan, should exactly match the <code>quote</code> object from output.<br/>Automation will not proceed with the loan application until the consent is provided.",
          "sourceOutputKey": "quote",
          "inputMethod": "Consent"
        },
        "employment": {
          "typeRef": "#/domains/LoanApplication/types/Employment"
        },
        "guarantor": {
          "typeRef": "#/domains/LoanApplication/types/GuarantorOrNull"
        },
        "directDebit": {
          "typeRef": "#/domains/LoanApplication/types/DirectDebitPaymentOrNull"
        },
        "mobilePinConfirmation": {
          "typeRef": "#/domains/LoanApplication/types/MobilePinConfirmation"
        },
        "mobilePinConfirmationRetry1": {
          "typeRef": "#/domains/LoanApplication/types/MobilePinConfirmation"
        },
        "mobilePinConfirmationRetry2": {
          "typeRef": "#/domains/LoanApplication/types/MobilePinConfirmation"
        },
        "changeMobileNumber": {
          "typeRef": "#/domains/LoanApplication/types/PhoneOrNull"
        },
        "emailVerification": {
          "typeRef": "#/domains/LoanApplication/types/EmailVerification"
        },
        "proofOfIncome": {
          "typeRef": "#/domains/LoanApplication/types/Files"
        },
        "proofOfId": {
          "typeRef": "#/domains/Generic/types/File"
        },
        "proofOfAddress": {
          "typeRef": "#/domains/Generic/types/File"
        },
        "expenses": {
          "typeRef": "#/domains/LoanApplication/types/Expenses"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "options": {
          "typeRef": "#/domains/LoanApplication/types/Options",
          "default": {},
          "initial": true
        },
        "selectedRepaymentDate": {
          "typeRef": "#/domains/LoanApplication/types/RepaymentDate"
        },
        "agreeTerms": {
          "typeRef": "#/domains/LoanApplication/types/Boolean"
        },
        "agreeDocuments": {
          "typeRef": "#/domains/LoanApplication/types/Boolean"
        }
      },
      "outputs": {
        "quote": {
          "typeRef": "#/domains/LoanApplication/types/Quote"
        },
        "documents": {
          "typeRef": "#/domains/LoanApplication/types/Documents"
        },
        "requirements": {
          "typeRef": "#/domains/LoanApplication/types/Requirements"
        },
        "confirmation": {
          "typeRef": "#/domains/LoanApplication/types/Confirmation"
        },
        "expenseTypes": {
          "typeRef": "#/domains/LoanApplication/types/ExpenseTypes"
        },
        "availableLoanTerms": {
          "typeRef": "#/domains/LoanApplication/types/LoanTerms"
        },
        "availableLoanPurposes": {
          "typeRef": "#/domains/LoanApplication/types/LoanPurposes"
        },
        "availableRepaymentDates": {
          "typeRef": "#/domains/LoanApplication/types/RepaymentDates"
        },
        "guarantorDocuments": {
          "typeRef": "#/domains/LoanApplication/types/Documents"
        },
        "loanType": {
          "typeRef": "#/domains/LoanApplication/types/LoanType"
        },
        "finalLoanAmount": {
          "typeRef": "#/domains/LoanApplication/types/LoanAmount"
        },
        "savedUrl": {
          "typeRef": "#/domains/LoanApplication/types/SavedUrl"
        },
        "debug": {
          "typeRef": "#/domains/LoanApplication/types/Anything"
        },
        "keyTerms": {
          "typeRef": "#/domains/LoanApplication/types/KeyTerms"
        },
        "financialPromotionRepresentativeSample": {
          "typeRef": "#/domains/LoanApplication/types/FinancialPromotionRepresentativeSample"
        }
      },
      "types": {
        "LoanTerms": {
          "type": "array",
          "items": {
            "$ref": "#/domains/LoanApplication/types/String"
          }
        },
        "LoanPurposes": {
          "type": "array",
          "items": {
            "$ref": "#/domains/LoanApplication/types/String"
          }
        },
        "String": {
          "type": "string"
        },
        "LoanType": {
          "type": "string",
          "description": "",
          "enum": [
            "personal",
            "guarantor"
          ]
        },
        "LoanAmount": {
          "type": "object",
          "$ref": "#/domains/Generic/types/Price",
          "description": "The loan amount contracted."
        },
        "RepaymentDates": {
          "type": "array",
          "items": {
            "$ref": "#/domains/LoanApplication/types/RepaymentDate"
          }
        },
        "RepaymentDate": {
          "type": "string"
        },
        "SavedUrl": {
          "type": "object",
          "$ref": "#/domains/Generic/types/Link"
        },
        "Loan": {
          "type": "object",
          "description": "Loan criteria",
          "properties": {
            "purpose": {
              "type": "string",
              "minLength": 1,
              "description": "Purpose of the loan.",
              "example": "buy a car"
            },
            "amount": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The loan amount required."
            },
            "repaymentMonths": {
              "type": "number",
              "description": "The number of months to repay the loan.",
              "example": 48
            },
            "existingLoan": {
              "type": "boolean",
              "description": "Existing loan with this provider."
            },
            "promotionCode": {
              "type": "string",
              "minLength": 1,
              "description": "Promotion code."
            }
          },
          "additionalProperties": false,
          "required": [
            "purpose",
            "amount",
            "repaymentMonths"
          ]
        },
        "OptionalExistingApplication": {
          "oneOf": [
            {
              "$ref": "#/domains/LoanApplication/types/ExistingApplication"
            },
            {
              "type": "null"
            }
          ]
        },
        "ExistingApplication": {
          "type": "object",
          "description": "Existing loan application",
          "properties": {
            "id": {
              "type": "string",
              "description": "loan applicaton id.",
              "example": "12345"
            },
            "token": {
              "type": "string",
              "description": "Loan application token.",
              "example": "abcde"
            }
          },
          "additionalProperties": false,
          "required": [
            "id",
            "token"
          ]
        },
        "ApplicantOrNull": {
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/LoanApplication/types/Applicant"
            },
            {
              "type": "null"
            }
          ]
        },
        "GuarantorOrNull": {
          "oneOf": [
            {
              "$ref": "#/domains/LoanApplication/types/Guarantor"
            },
            {
              "type": "null"
            }
          ]
        },
        "Applicant": {
          "type": "object",
          "description": "The person applying for the loan.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "addresses": {
              "type": "array",
              "description": "A list of addresses for the applicant.",
              "pii": true,
              "minItems": 1,
              "maxItems": 9,
              "items": {
                "$ref": "#/domains/LoanApplication/types/LoanAddress"
              }
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "relationshipStatus": {
              "type": "string",
              "description": "",
              "enum": [
                "single",
                "married",
                "divorced",
                "cohabiting",
                "widower"
              ]
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            },
            "countryOfBirth": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country of birth."
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "dependantsCount": {
              "type": "integer",
              "minimum": 0
            },
            "residentialStatus": {
              "$ref": "#/domains/LoanApplication/types/ResidentialStatus"
            },
            "partnerInfo": {
              "$ref": "#/domains/LoanApplication/types/PartnerInfo"
            },
            "openBankingInfo": {
              "$ref": "#/domains/LoanApplication/types/OpenBankingInfo"
            }
          },
          "required": [
            "person",
            "dateOfBirth",
            "nationality"
          ],
          "additionalProperties": false
        },
        "PartnerInfo": {
          "type": "object",
          "properties": {
            "partnerId": {
              "type": "string"
            },
            "partnerTrackingId": {
              "type": "string"
            },
            "partnerAdditionalReference": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": [
            "partnerId",
            "partnerTrackingId",
            "partnerAdditionalReference"
          ]
        },
        "OpenBankingInfo": {
          "type": "object",
          "properties": {
            "bankSortcode": {
              "type": "string"
            },
            "bankAccountNumber": {
              "type": "string"
            },
            "averageIncomeLast30Days": {
              "type": "string"
            },
            "averageIncomeAvg6Months": {
              "type": "string"
            },
            "averageExpenditureLast30Days": {
              "type": "string"
            },
            "averageExpenditureAvg6Months": {
              "type": "string"
            },
            "mortgageRentLast30Days": {
              "type": "string"
            },
            "mortgageRentAvg6Months": {
              "type": "string"
            },
            "unsecuredCreditPaymentsLast30Days": {
              "type": "string"
            },
            "unsecuredCreditPaymentsAvg6Months": {
              "type": "string"
            },
            "unsecuredCreditPaymentsVolLast30Days": {
              "type": "string"
            },
            "unsecuredCreditPaymentsVolAvg6Months": {
              "type": "string"
            },
            "foodLast30Days": {
              "type": "string"
            },
            "foodAvg6Months": {
              "type": "string"
            },
            "travelPetrolLast30Days": {
              "type": "string"
            },
            "travelPetrolAvg6Months": {
              "type": "string"
            },
            "utilitiesLast30Days": {
              "type": "string"
            },
            "utilitiesAvg6Months": {
              "type": "string"
            },
            "councilTaxLast30Days": {
              "type": "string"
            },
            "councilTaxAvg6Months": {
              "type": "string"
            },
            "childCareLast30Days": {
              "type": "string"
            },
            "childCareAvg6Months": {
              "type": "string"
            },
            "gamblingTransactionLast30Days": {
              "type": "string"
            },
            "gamblingTransactionAvg6Months": {
              "type": "string"
            },
            "gamblingTransactionVolLast30Days": {
              "type": "string"
            },
            "gamblingTransactionVolAvg6Months": {
              "type": "string"
            },
            "failedDDLast30Days": {
              "type": "string"
            },
            "failedDDAvg6Months": {
              "type": "string"
            },
            "failedDDVolLast30Days": {
              "type": "string"
            },
            "failedDDVolAvg6Months": {
              "type": "string"
            },
            "failedStandingOrderLast30Days": {
              "type": "string"
            },
            "failedStandingOrderAvg6Months": {
              "type": "string"
            },
            "failedStandingOrderVolLast30Days": {
              "type": "string"
            },
            "failedStandingOrderVolAvg6Months": {
              "type": "string"
            },
            "savingsLast30Days": {
              "type": "string"
            },
            "savingsAvg6Months": {
              "type": "string"
            },
            "savingsVolLast30Days": {
              "type": "string"
            },
            "savingsVolAvg6Months": {
              "type": "string"
            },
            "industry": {
              "type": "string"
            },
            "jobTitle": {
              "type": "string"
            },
            "noOfDependents": {
              "type": "string"
            },
            "openBanking": {
              "type": "string"
            }
          },
          "additionalProperties": false,
          "required": []
        },
        "Guarantor": {
          "type": "object",
          "description": "The person guaranteeing for the loan.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "addresses": {
              "type": "array",
              "description": "A list of addresses for the guarantor.",
              "pii": true,
              "minItems": 1,
              "maxItems": 9,
              "items": {
                "$ref": "#/domains/LoanApplication/types/LoanAddress"
              }
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "relationshipStatus": {
              "type": "string",
              "description": "",
              "enum": [
                "single",
                "married",
                "divorced",
                "cohabiting",
                "widower"
              ]
            },
            "relationshipToApplicant": {
              "type": "string",
              "description": "",
              "enum": [
                "friend",
                "mother",
                "father",
                "partner",
                "sister",
                "brother",
                "mother-in-law",
                "father-in-law",
                "married",
                "grandmother",
                "grandfather",
                "cousin",
                "daughter",
                "son",
                "aunt",
                "brother-in-law",
                "sister-in-law",
                "uncle",
                "son-in-law",
                "daughter-in-law",
                "employer",
                "employee",
                "niece",
                "nephew"
              ]
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            },
            "countryOfBirth": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country of birth."
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "dependantsCount": {
              "type": "integer",
              "minimum": 0
            },
            "residentialStatus": {
              "$ref": "#/domains/LoanApplication/types/ResidentialStatus"
            }
          },
          "required": [
            "person",
            "dateOfBirth",
            "nationality"
          ],
          "additionalProperties": false
        },
        "Addresses": {
          "type": "array",
          "description": "A list of addresses for the applicant.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/LoanApplication/types/LoanAddress"
          }
        },
        "LoanAddress": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "streetName": {
              "type": "string",
              "description": "Street name.",
              "minLength": 1,
              "example": "Twin Peaks Blv"
            },
            "houseNumber": {
              "type": "integer",
              "description": "House number.",
              "minLength": 1,
              "example": "501"
            },
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "minLength": 1,
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            },
            "dateMovedIn": {
              "type": "string",
              "format": "date",
              "description": "Date at which the applicant moved into this address."
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "own",
                "family",
                "rent"
              ]
            },
            "mortgage": {
              "$ref": "#/domains/LoanApplication/types/Mortgage"
            }
          },
          "required": [
            "city",
            "postcode",
            "countryCode",
            "countrySubdivision"
          ],
          "additionalProperties": false
        },
        "ResidentialStatus": {
          "type": "string",
          "description": "",
          "enum": [
            "own",
            "family",
            "rent"
          ]
        },
        "Mortgage": {
          "type": "object",
          "description": "Mortgage information for the associated address.",
          "pii": true,
          "properties": {
            "monthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month by the loan applicant."
            },
            "jointMonthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month for a joint mortgage."
            }
          },
          "required": [
            "monthlyPayment"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "description": "Applicant employment details.",
          "pii": true,
          "properties": {
            "companyName": {
              "type": "string",
              "minLength": 1
            },
            "industry": {
              "type": "string",
              "minLength": 1
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "employed-fulltime",
                "employed-parttime",
                "unemployed",
                "self-employed",
                "on-benefits",
                "retired",
                "student"
              ]
            },
            "jobTitle": {
              "type": "string",
              "minLength": 1,
              "description": "Job title.",
              "example": "Computer programmer"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "grossIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual gross salary (before tax)."
            },
            "netIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual net salary (after tax)."
            },
            "payFrequency": {
              "type": "string",
              "enum": [
                "annually",
                "monthly",
                "weekly",
                "fortnightly",
                "four-weekly"
              ]
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        "PhoneOrNull": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/Phone"
            },
            {
              "type": "null"
            }
          ]
        },
        "DirectDebitPaymentOrNull": {
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/LoanApplication/types/DirectDebitPayment"
            },
            {
              "type": "null"
            }
          ]
        },
        "DirectDebitPayment": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "sortCode": {
              "type": "string",
              "description": "Bank sort code",
              "pattern": "\\d{2}-?\\d{2}-?\\d{2}",
              "example": "56-00-29"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 8,
              "maxLength": 8,
              "description": "Cover marketing name as provided by the insurer.",
              "example": "26207729"
            },
            "accountHolder": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "accountHolderAddress": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "selectedPaymentDay": {
              "type": "string",
              "description": "Preferred payment day, one of availableDirectDebitPaymentDays where available.",
              "example": "10"
            }
          },
          "required": [
            "sortCode",
            "accountNumber"
          ],
          "additionalProperties": false
        },
        "MobilePinConfirmation": {
          "type": "object",
          "description": "Mobile pin confirmation to confirm the applicant's mobile number.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "pin confirmation code.",
              "example": "1234",
              "minLength": 3,
              "maxLength": 10
            }
          },
          "required": [
            "code"
          ],
          "additionalProperties": false
        },
        "EmailVerification": {
          "type": "object",
          "description": "Confirmation that email verification is done.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "Confirmation code.",
              "example": "1234",
              "minLength": 3,
              "maxLength": 100
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Files": {
          "type": "array",
          "description": "A list of uploaded files.",
          "pii": true,
          "minItems": 1,
          "maxItems": 99,
          "items": {
            "$ref": "#/domains/Generic/types/File"
          }
        },
        "Requirements": {
          "type": "array",
          "description": "A list of requirements.",
          "minItems": 0,
          "maxItems": 99,
          "items": {
            "$ref": "#/domains/LoanApplication/types/Requirement"
          }
        },
        "Requirement": {
          "type": "object",
          "description": "A required input for proof - e.g. of income.",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "description": "Name of requirement.",
              "example": "income"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Quote": {
          "type": "object",
          "description": "Loan quote",
          "pii": true,
          "properties": {
            "amount": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The loan amount required."
            },
            "monthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount repayable per month."
            },
            "repaymentMonths": {
              "type": "number",
              "description": "The number of months to repay the loan.",
              "example": 48
            },
            "apr": {
              "type": "number",
              "description": "The APR of the loan.",
              "example": 0.5
            },
            "fee": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Additional loan fee (if applicable)."
            }
          },
          "additionalProperties": false,
          "required": [
            "amount",
            "repaymentMonths",
            "apr"
          ]
        },
        "Documents": {
          "type": "array",
          "description": "A list of downloadable documents.",
          "pii": true,
          "minItems": 0,
          "maxItems": 99,
          "items": {
            "oneOf": [
              {
                "$ref": "#/domains/Generic/types/File"
              },
              {
                "$ref": "#/domains/Generic/types/Link"
              }
            ]
          }
        },
        "Confirmation": {
          "type": "object",
          "description": "Confirmation of the loan.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "Loan confirmation code",
              "example": "1234"
            },
            "message": {
              "type": "string",
              "description": "Confirmation message from the web page.",
              "example": "Your loan is confirmed."
            },
            "savedUrl": {
              "$ref": "#/domains/Generic/types/Link"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "skipMobilePinVerification": {
              "type": "boolean",
              "default": false
            },
            "continueAfterSubmittingUrl": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Expenses": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/LoanApplication/types/Expense"
          }
        },
        "Expense": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1,
              "example": "How much do you earn per month?"
            },
            "value": {
              "type": "string",
              "minLength": 1,
              "example": "2000"
            }
          },
          "required": [
            "key",
            "value"
          ],
          "additionalProperties": false
        },
        "ExpenseTypes": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/LoanApplication/types/ExpenseType"
          }
        },
        "ExpenseType": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "key"
          ],
          "additionalProperties": false
        },
        "FinancialPromotionRepresentativeSample": {
          "type": "object",
          "$ref": "#/domains/Generic/types/StructuredTextItem"
        },
        "Boolean": {
          "type": "boolean"
        },
        "Anything": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array"
            },
            {
              "type": "object"
            },
            {
              "type": "boolean"
            }
          ]
        },
        "KeyTerms": {
          "type": "object",
          "pii": true,
          "properties": {
            "loanAmount": {
              "type": "integer",
              "minLength": 1
            },
            "term": {
              "type": "integer",
              "minLength": 1
            },
            "monthlyRepayment": {
              "type": "integer",
              "minLength": 1
            },
            "apr": {
              "type": "integer",
              "minLength": 1
            },
            "totalAmountPayable": {
              "type": "integer",
              "minLength": 1
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "ConnectionReset",
          "category": "website",
          "description": "The supplier reset the TCP connection."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The customer already has a loan with this provider."
        },
        {
          "code": "EligibleForTopUp",
          "category": "client",
          "description": "The customer already has a loan with this provider and is eligible for a top up."
        },
        {
          "code": "GuarantorDeclined",
          "category": "client",
          "description": "Guarantor denied by lender."
        },
        {
          "code": "GuarantorDetailsInvalid",
          "category": "client",
          "description": "The guarantor details are not valid."
        },
        {
          "code": "LoanApplicationDeclined",
          "category": "client",
          "description": "Loan application denied by lender."
        },
        {
          "code": "LoanApplicationSuperseded",
          "category": "client",
          "description": "Loan application is superseded."
        },
        {
          "code": "MobilePinVerificationFailed",
          "category": "client",
          "description": "Pin verification failed."
        },
        {
          "code": "LoanTermsValidationFailed",
          "category": "client",
          "description": "Maximum amount or loan duration invalid."
        },
        {
          "code": "DirectDebitInvalid",
          "category": "client",
          "description": "The directDebit is invalid, according to the supplier."
        }
      ]
    },
    "LoanApplicationSA": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "email": {
          "typeRef": "#/domains/LoanApplicationSA/types/Email"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "loan": {
          "typeRef": "#/domains/LoanApplicationSA/types/Loan"
        },
        "applicant": {
          "typeRef": "#/domains/LoanApplicationSA/types/Applicant"
        },
        "employment": {
          "typeRef": "#/domains/LoanApplicationSA/types/Employment"
        },
        "tokenId": {
          "typeRef": "#/domains/LoanApplicationSA/types/PiiString"
        },
        "directDebit": {
          "typeRef": "#/domains/LoanApplicationSA/types/DirectDebitPaymentOrNull"
        },
        "mobilePinConfirmation": {
          "typeRef": "#/domains/LoanApplicationSA/types/MobilePinConfirmation"
        },
        "mobilePinConfirmationRetry1": {
          "typeRef": "#/domains/LoanApplicationSA/types/MobilePinConfirmation"
        },
        "mobilePinConfirmationRetry2": {
          "typeRef": "#/domains/LoanApplicationSA/types/MobilePinConfirmation"
        },
        "expenses": {
          "typeRef": "#/domains/LoanApplicationSA/types/Expenses"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "options": {
          "typeRef": "#/domains/LoanApplicationSA/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "availableIndustryOptions": {
          "typeRef": "#/domains/LoanApplicationSA/types/StringArray"
        },
        "availableJobTitles": {
          "typeRef": "#/domains/LoanApplicationSA/types/StringArray"
        },
        "availableBanks": {
          "typeRef": "#/domains/LoanApplicationSA/types/StringArray"
        },
        "expenseTypes": {
          "typeRef": "#/domains/LoanApplicationSA/types/ExpenseTypes"
        },
        "confirmation": {
          "typeRef": "#/domains/LoanApplicationSA/types/Confirmation"
        },
        "finalLoanAmount": {
          "typeRef": "#/domains/LoanApplicationSA/types/LoanAmount"
        },
        "existingEmail": {
          "typeRef": "#/domains/LoanApplicationSA/types/Existing"
        },
        "existingUser": {
          "typeRef": "#/domains/LoanApplicationSA/types/Existing"
        }
      },
      "types": {
        "StringArray": {
          "type": "array",
          "items": {
            "$ref": "#/domains/LoanApplicationSA/types/String"
          }
        },
        "String": {
          "type": "string"
        },
        "PiiString": {
          "type": "string",
          "pii": true
        },
        "Loan": {
          "type": "object",
          "description": "Loan criteria",
          "properties": {
            "purpose": {
              "type": "string",
              "minLength": 1,
              "description": "Purpose of the loan.",
              "example": "buy a car"
            },
            "amount": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The loan amount required."
            },
            "repaymentMonths": {
              "type": "number",
              "description": "The number of months to repay the loan.",
              "example": 48
            },
            "existingLoan": {
              "type": "boolean",
              "description": "Existing loan with this provider."
            },
            "repaymentDays": {
              "type": "number",
              "description": "The number of days to repay the loan.",
              "example": 36
            },
            "promotionCode": {
              "type": "string",
              "minLength": 1,
              "description": "Promotion code."
            }
          },
          "additionalProperties": false,
          "required": [
            "amount"
          ]
        },
        "LoanAmount": {
          "type": "object",
          "$ref": "#/domains/Generic/types/Price",
          "description": "The loan amount contracted."
        },
        "ExistingApplication": {
          "type": "object",
          "description": "Existing loan application",
          "properties": {
            "id": {
              "type": "string",
              "description": "loan applicaton id.",
              "example": "12345"
            },
            "token": {
              "type": "string",
              "description": "Loan application token.",
              "example": "abcde"
            }
          },
          "additionalProperties": false,
          "required": [
            "id",
            "token"
          ]
        },
        "Email": {
          "type": "string",
          "format": "email",
          "example": "hello@example.com"
        },
        "Applicant": {
          "type": "object",
          "description": "The person applying for the loan.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/LoanApplicationSA/types/Person"
            },
            "addresses": {
              "type": "array",
              "description": "A list of addresses for the applicant.",
              "pii": true,
              "minItems": 1,
              "maxItems": 9,
              "items": {
                "$ref": "#/domains/LoanApplicationSA/types/LoanAddress"
              }
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "relationshipStatus": {
              "type": "string",
              "description": "",
              "enum": [
                "single",
                "married-prenuptial",
                "married-community",
                "divorced",
                "living-together",
                "cohabiting",
                "separated-prenuptial",
                "separated-community",
                "widower",
                "other-prenuptial",
                "other-community"
              ]
            },
            "nationality": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Nationality according to passport."
            },
            "dialect": {
              "type": "string",
              "description": "",
              "enum": [
                "other",
                "en",
                "af",
                "nd",
                "xh",
                "zu",
                "nso",
                "st",
                "tn",
                "ss",
                "ve",
                "ts"
              ]
            },
            "countryOfBirth": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country of birth."
            },
            "email": {
              "type": "string",
              "format": "email",
              "example": "hello@example.com"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "dependantsCount": {
              "type": "integer",
              "minimum": 0
            },
            "residentialStatus": {
              "$ref": "#/domains/LoanApplicationSA/types/ResidentialStatus"
            }
          },
          "required": [
            "person",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            },
            "document": {
              "$ref": "#/domains/Generic/types/IdentityDocument"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "Addresses": {
          "type": "array",
          "description": "A list of addresses for the applicant.",
          "pii": true,
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/LoanApplicationSA/types/LoanAddress"
          }
        },
        "LoanAddress": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "minLength": 1,
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "San Francisco"
            },
            "streetName": {
              "type": "string",
              "description": "Name of the street.",
              "minLength": 1,
              "example": "Clerkenwell Close"
            },
            "streetNumber": {
              "type": "string",
              "description": "Number of the street or other building identifier, such as house number or house name",
              "minLength": 1,
              "example": "27-31"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "minLength": 1,
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "countrySubdivision": {
              "$ref": "#/domains/Generic/types/CountrySubdivision"
            },
            "dateMovedIn": {
              "type": "string",
              "format": "date",
              "description": "Date at which the applicant moved into this address."
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "own",
                "family",
                "rent"
              ]
            },
            "mortgage": {
              "$ref": "#/domains/LoanApplicationSA/types/Mortgage"
            }
          },
          "required": [
            "city",
            "postcode",
            "countryCode",
            "countrySubdivision"
          ],
          "additionalProperties": false
        },
        "ResidentialStatus": {
          "type": "string",
          "description": "",
          "enum": [
            "own",
            "family",
            "rent"
          ]
        },
        "Mortgage": {
          "type": "object",
          "description": "Mortgage information for the associated address.",
          "pii": true,
          "properties": {
            "monthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month by the loan applicant."
            },
            "jointMonthlyPayment": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "The amount paid per month for a joint mortgage."
            }
          },
          "required": [
            "monthlyPayment"
          ],
          "additionalProperties": false
        },
        "Employment": {
          "type": "object",
          "description": "Applicant employment details.",
          "pii": true,
          "properties": {
            "companyName": {
              "type": "string",
              "minLength": 1
            },
            "status": {
              "type": "string",
              "description": "",
              "enum": [
                "employed-fulltime",
                "employed-parttime",
                "unemployed",
                "self-employed",
                "on-benefits",
                "retired",
                "student"
              ]
            },
            "selectedIndustry": {
              "type": "string",
              "minLength": 1
            },
            "selectedJobTitle": {
              "type": "string",
              "minLength": 1
            },
            "period": {
              "$ref": "#/domains/LoanApplicationSA/types/EmploymentPeriod"
            },
            "jobTitle": {
              "type": "string",
              "minLength": 1,
              "description": "Job title.",
              "example": "Computer programmer"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "grossIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual gross salary (before tax)."
            },
            "netIncome": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Applicant's total annual net salary (after tax)."
            },
            "payFrequency": {
              "type": "string",
              "enum": [
                "monthly",
                "twice-monthly",
                "weekly",
                "bi-weekly",
                "last-day-of-month",
                "last-friday-of-month"
              ]
            },
            "payDay": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        "EmploymentPeriod": {
          "type": "object",
          "description": "Number of employment year and months.",
          "pii": true,
          "properties": {
            "years": {
              "type": "integer"
            },
            "months": {
              "type": "integer"
            }
          },
          "required": [
            "years",
            "months"
          ],
          "additionalProperties": false
        },
        "DirectDebitPaymentOrNull": {
          "pii": true,
          "oneOf": [
            {
              "$ref": "#/domains/LoanApplicationSA/types/DirectDebitPayment"
            },
            {
              "type": "null"
            }
          ]
        },
        "DirectDebitPayment": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "selectedBank": {
              "type": "string",
              "example": "First National Bank"
            },
            "account": {
              "$ref": "#/domains/LoanApplicationSA/types/Account"
            }
          },
          "required": [
            "selectedBank",
            "account"
          ],
          "additionalProperties": false
        },
        "Account": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "example": "Cheque",
              "enum": [
                "cheque",
                "current",
                "transmission",
                "savings"
              ]
            },
            "number": {
              "type": "string",
              "minLength": 12,
              "maxLength": 12,
              "description": "Cover marketing name as provided by the insurer.",
              "example": "262077292654"
            }
          },
          "required": [
            "type",
            "number"
          ],
          "additionalProperties": false
        },
        "MobilePinConfirmation": {
          "type": "object",
          "description": "Mobile pin confirmation to confirm the applicant's mobile number.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "pin confirmation code.",
              "example": "1234",
              "minLength": 3,
              "maxLength": 10
            }
          },
          "required": [
            "code"
          ],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "skipMobilePinVerification": {
              "type": "boolean",
              "default": false
            },
            "continueAfterSubmittingUrl": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Existing": {
          "type": "string",
          "enum": [
            "existing",
            "not-existing",
            "unknown"
          ]
        },
        "Expenses": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/LoanApplicationSA/types/Expense"
          }
        },
        "Expense": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1,
              "example": "How much do you earn per month?"
            },
            "value": {
              "type": "string",
              "minLength": 1,
              "example": "2000"
            }
          },
          "required": [
            "key",
            "value"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Confirmation of the loan.",
          "pii": true,
          "properties": {
            "code": {
              "type": "string",
              "description": "Loan confirmation code",
              "example": "1234"
            },
            "message": {
              "type": "string",
              "description": "Confirmation message from the web page.",
              "example": "Your loan is confirmed."
            },
            "savedUrl": {
              "$ref": "#/domains/Generic/types/Link"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "ExpenseTypes": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/LoanApplicationSA/types/ExpenseType"
          }
        },
        "ExpenseType": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "key"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "ConnectionReset",
          "category": "website",
          "description": "The supplier reset the TCP connection."
        },
        {
          "code": "AlreadyACustomer",
          "category": "client",
          "description": "The customer already has a loan with this provider."
        },
        {
          "code": "EligibleForTopUp",
          "category": "client",
          "description": "The customer already has a loan with this provider and is eligible for a top up."
        },
        {
          "code": "GuarantorDeclined",
          "category": "client",
          "description": "Guarantor denied by lender."
        },
        {
          "code": "GuarantorDetailsInvalid",
          "category": "client",
          "description": "The guarantor details are not valid."
        },
        {
          "code": "LoanApplicationSADeclined",
          "category": "client",
          "description": "Loan application denied by lender."
        },
        {
          "code": "MobilePinVerificationFailed",
          "category": "client",
          "description": "Pin verification failed."
        },
        {
          "code": "LoanTermsValidationFailed",
          "category": "client",
          "description": "Maximum amount or loan duration invalid."
        },
        {
          "code": "DirectDebitInvalid",
          "category": "client",
          "description": "The directDebit is invalid, according to the supplier."
        }
      ]
    },
    "LockManagementEdit": {
      "description": "Allows automating hotel electronic door locks.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/LockManagementEdit/types/Account",
          "description": "If required, used for logging in."
        },
        "guestInfo": {
          "typeRef": "#/domains/LockManagementEdit/types/Guest",
          "description": "Personal details about the guest and."
        },
        "device": {
          "typeRef": "#/domains/LockManagementEdit/types/Device",
          "description": "Device lock parameters."
        }
      },
      "outputs": {
        "lockState": {
          "typeRef": "#/domains/LockManagementEdit/types/State",
          "description": "Device lock status."
        }
      },
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Guest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/LockManagementEdit/types/Person"
            },
            "contact": {
              "$ref": "#/domains/LockManagementEdit/types/GuestContact"
            }
          },
          "required": [
            "person"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs",
                "N/A"
              ]
            },
            "firstName": {
              "type": "string",
              "minLength": 1,
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "minLength": 1,
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Guest's date of birth in YYYY-MM-DD format.",
              "example": "1976-01-27"
            },
            "ageType": {
              "type": "string",
              "description": "Age type of guests.",
              "example": "Adult",
              "enum": [
                "adult",
                "child",
                "infant"
              ]
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "mobileNumber": {
              "type": "string"
            },
            "email": {
              "type": "string",
              "format": "email",
              "description": "Email address used for contact.",
              "example": "client@example.com"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Device": {
          "type": "object",
          "pii": true,
          "properties": {
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkInTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkOutTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "location": {
              "type": "string",
              "minLength": 1,
              "description": "Name of the device lock."
            },
            "name": {
              "type": "string",
              "minLength": 1,
              "description": "Name of the device lock."
            },
            "PIN": {
              "type": "string",
              "minLength": 1,
              "description": "Personal identification number of the device lock."
            }
          },
          "required": [
            "checkInDate",
            "checkOutDate",
            "location",
            "name",
            "PIN"
          ],
          "additionalProperties": false
        },
        "State": {
          "type": "object",
          "pii": true,
          "properties": {
            "status": {
              "type": "string",
              "minLength": 1,
              "description": "Device lock status."
            }
          },
          "required": [
            "status"
          ],
          "additionalProperties": false
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "LockNotFound",
          "category": "client",
          "description": "Device lock not found, usually caused by wrong device reference or name."
        },
        {
          "code": "LocationNotFound",
          "category": "client",
          "description": "Location not found, usually caused by wrong location reference or name."
        },
        {
          "code": "LockDetailsInvalid",
          "category": "client",
          "description": "Invalid device details."
        }
      ]
    },
    "LockManagementStatus": {
      "description": "Allows automating hotel electronic door locks.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/LockManagementStatus/types/Account",
          "description": "If required, used for logging in."
        },
        "device": {
          "typeRef": "#/domains/LockManagementStatus/types/Device",
          "description": "Device lock parameters."
        }
      },
      "outputs": {
        "checkInReceived": {
          "typeRef": "#/domains/LockManagementStatus/types/CheckInReceived",
          "description": "Information about check in."
        },
        "lockOnlineAtStatus": {
          "typeRef": "#/domains/LockManagementStatus/types/Boolean",
          "description": "Device lock status."
        },
        "batteryStatus": {
          "typeRef": "#/domains/LockManagementStatus/types/BatteryStatus",
          "description": "Device battery status."
        },
        "lastSyncTime": {
          "typeRef": "#/domains/LockManagementStatus/types/LastSyncTime",
          "description": "Device lock last synchronization date & time."
        }
      },
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Device": {
          "type": "object",
          "pii": true,
          "properties": {
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkInTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkOutTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "location": {
              "type": "string",
              "minLength": 1,
              "description": "Name of the device lock."
            },
            "name": {
              "type": "string",
              "minLength": 1,
              "description": "Name of the device lock."
            },
            "PIN": {
              "type": "string",
              "description": "Personal identification number of the device lock."
            }
          },
          "required": [
            "location",
            "name"
          ],
          "additionalProperties": false
        },
        "CheckInReceived": {
          "type": "array",
          "minItems": 0,
          "pii": true,
          "items": {
            "$ref": "#/domains/LockManagementStatus/types/CheckInReceivedItem"
          }
        },
        "CheckInReceivedItem": {
          "type": "object",
          "pii": true,
          "properties": {
            "guestName": {
              "type": "string",
              "example": "Mark Doe"
            },
            "PIN": {
              "type": "string",
              "description": "Personal identification number of the device lock."
            },
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "received": {
              "$ref": "#/domains/LockManagementStatus/types/Boolean"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "BatteryStatus": {
          "type": "string",
          "minLength": 1,
          "enum": [
            "N/A",
            "full"
          ]
        },
        "LastSyncTime": {
          "type": "string",
          "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
          "description": "Date and time (terminal local time).",
          "example": "2018-02-02 19:40"
        },
        "Boolean": {
          "type": "boolean",
          "enum": [
            true,
            false
          ]
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "LockNotFound",
          "category": "client",
          "description": "Device lock not found, usually caused by wrong device reference or name."
        },
        {
          "code": "LocationNotFound",
          "category": "client",
          "description": "Location not found, usually caused by wrong location reference or name."
        },
        {
          "code": "LockDetailsInvalid",
          "category": "client",
          "description": "Invalid device details."
        }
      ]
    },
    "MobileSignup": {
      "description": "Allows subscribing to mobile offers (which might also include delivery of SIM cards or other mobile related items)",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/code"
      },
      "inputs": {
        "applicant": {
          "typeRef": "#/domains/MobileSignup/types/Anything",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "selectedOffer": {
          "typeRef": "#/domains/MobileSignup/types/Anything"
        },
        "deliveryAddress": {
          "typeRef": "#/domains/MobileSignup/types/Anything"
        },
        "selectedDeliveryAddress": {
          "typeRef": "#/domains/MobileSignup/types/Anything"
        },
        "selectedDeliveryDate": {
          "typeRef": "#/domains/MobileSignup/types/Date"
        },
        "bankDetails": {
          "typeRef": "#/domains/MobileSignup/types/Anything"
        },
        "account": {
          "typeRef": "#/domains/MobileSignup/types/Account"
        },
        "options": {
          "typeRef": "#/domains/MobileSignup/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "availableOffers": {
          "typeRef": "#/domains/MobileSignup/types/Anything",
          "description": "Available offers for subscription"
        },
        "availableDeliveryAddresses": {
          "typeRef": "#/domains/MobileSignup/types/Anything",
          "description": "List of available delivery addresses provided by the website"
        },
        "availableDeliveryDates": {
          "typeRef": "#/domains/MobileSignup/types/AvailableDeliveryDates"
        },
        "priceBreakdown": {
          "typeRef": "#/domains/MobileSignup/types/Anything"
        },
        "confirmation": {
          "typeRef": "#/domains/MobileSignup/types/Confirmation"
        }
      },
      "types": {
        "Anything": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array"
            },
            {
              "type": "object"
            }
          ]
        },
        "Date": {
          "type": "string",
          "description": "Delivery date in YYYY-MM-DD format.",
          "format": "date",
          "example": "2019-05-27"
        },
        "AvailableDeliveryDates": {
          "type": "array",
          "description": "A list of delivery dates.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/MobileSignup/types/Date"
          }
        },
        "Confirmation": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string",
              "example": "abc"
            },
            "message": {
              "type": "string"
            }
          }
        },
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            }
          },
          "required": [
            "email",
            "phone",
            "isExisting"
          ],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "DuplicateRequest",
          "category": "client",
          "description": "The website claims this is a duplicate attempt."
        }
      ]
    },
    "MotorInsurance": {
      "description": "",
      "private": false,
      "dataExtractionDomainId": "MotorInsuranceExtraction",
      "successCode": {
        "outputKey": "purchaseConfirmation",
        "valuePath": "/purchaseReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "quote": {
          "typeRef": "#/domains/MotorInsurance/types/Quote",
          "canonical": [
            "/email"
          ]
        },
        "account": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAccount"
        },
        "payment": {
          "typeRef": "#/domains/MotorInsurance/types/Payment"
        },
        "directDebit": {
          "typeRef": "#/domains/MotorInsurance/types/DirectDebitPayment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "vehicle": {
          "typeRef": "#/domains/MotorInsurance/types/Vehicle"
        },
        "options": {
          "typeRef": "#/domains/MotorInsurance/types/Options",
          "default": {},
          "initial": true
        },
        "selectedVoluntaryExcess": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected voluntary excess",
          "sourceOutputKey": "availableVoluntaryExcesses",
          "inputMethod": "SelectOne"
        },
        "selectedLegalCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected legal cover.",
          "sourceOutputKey": "availableLegalCovers",
          "inputMethod": "SelectOne"
        },
        "selectedExcessProtectCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected excess protection cover.",
          "sourceOutputKey": "availableExcessProtectCovers",
          "inputMethod": "SelectOne"
        },
        "selectedPersonalInjuryCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected personal injury cover.",
          "sourceOutputKey": "availablePersonalInjuryCovers",
          "inputMethod": "SelectOne"
        },
        "selectedCarHireCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected car hire cover.",
          "sourceOutputKey": "availableCarHireCovers",
          "inputMethod": "SelectOne"
        },
        "selectedBreakdownCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected breakdown cover.",
          "sourceOutputKey": "availableBreakdownCovers",
          "inputMethod": "SelectOne"
        },
        "selectedNoClaimsDiscountProtection": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected no claims discount protection.",
          "sourceOutputKey": "availableNoClaimsDiscountProtection",
          "inputMethod": "SelectOne"
        },
        "selectedWindscreenCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected no claims discount protection.",
          "sourceOutputKey": "availableWindscreenCovers",
          "inputMethod": "SelectOne"
        },
        "selectedKeyReplacementCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected no claims discount protection.",
          "sourceOutputKey": "availableKeyReplacementCovers",
          "inputMethod": "SelectOne"
        },
        "selectedMisfuelCover": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedCover",
          "description": "Selected no claims discount protection.",
          "sourceOutputKey": "availableMisfuelCovers",
          "inputMethod": "SelectOne"
        },
        "selectedPaymentTerm": {
          "typeRef": "#/domains/MotorInsurance/types/PaymentTerm",
          "description": "Payment term to be used.",
          "sourceOutputKey": "availablePaymentTerms",
          "inputMethod": "SelectOne"
        },
        "selectedMarketingContactOptions": {
          "typeRef": "#/domains/MotorInsurance/types/SelectedItem",
          "description": "List of marketing contact options to be selected.",
          "sourceOutputKey": "availableMarketingContactOptions",
          "inputMethod": "SelectMany"
        },
        "cookies": {
          "typeRef": "#/domains/Generic/types/Cookies",
          "initial": true
        }
      },
      "outputs": {
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "estimatedPrice": {
          "description": "Emitted before asking for payment information.<br/>This is usually not the final amount to be paid, especially on websites which charge credit and company cards additionally. You will get <code>finalPrice</code> later.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "purchaseConfirmation": {
          "typeRef": "#/domains/MotorInsurance/types/PurchaseConfirmation"
        },
        "availableVoluntaryExcesses": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "List of voluntary excesses to choose from."
        },
        "availableExcessProtectCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableLegalCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableBreakdownCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availablePersonalInjuryCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableCarHireCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableWindscreenCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableKeyReplacementCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableMisfuelCovers": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "Emitted when actual cover information is collected.<br/>Note: on deep links with pre-selected additional cover this output may not be provided."
        },
        "availableNoClaimsDiscountProtection": {
          "typeRef": "#/domains/MotorInsurance/types/NullableAvailableCovers",
          "description": "List of no claims discount protection options supported by this insurer."
        },
        "contactUs": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the contact info is presented."
        },
        "quoteReference": {
          "typeRef": "#/domains/MotorInsurance/types/QuoteReference",
          "description": "Emitted when the quote reference is presented."
        },
        "excessBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the excess breakdown is presented."
        },
        "excessInfo": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the excess information is presented."
        },
        "priceBreakdown": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the price breakdown is presented."
        },
        "statutoryStatusDisclosure": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the statutory status disclosure text is presented."
        },
        "faq": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the FAQ link or document is presented."
        },
        "coverSummary": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Emitted when the cover summary is presented."
        },
        "assumptions": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the assumptions are presented."
        },
        "statements": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the statements are presented."
        },
        "feesSummary": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the fees are presented."
        },
        "policyWording": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the policy wording is presented."
        },
        "statementOfFact": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the statement of fact is presented."
        },
        "privacyPolicy": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the privacy policy is presented."
        },
        "vehicleDetails": {
          "typeRef": "#/domains/MotorInsurance/types/Vehicle",
          "description": "Emitted when the vehicle information is presented."
        },
        "supportedPaymentCardTypes": {
          "typeRef": "#/domains/MotorInsurance/types/PaymentCardTypes",
          "description": "List of payment cards supported by this insurer."
        },
        "availablePaymentTerms": {
          "typeRef": "#/domains/MotorInsurance/types/PaymentTerms",
          "description": "List of payment terms supported by the insurer."
        },
        "noClaimsDiscountProtectionInfo": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when the no claims discount protection info is presented."
        },
        "financialPromotionRepresentativeExample": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when a representative example is presented, usually when paying in monthly installments as part of a financial promotion."
        },
        "financialPromotionContactAddress": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Emitted when a representative example is presented, usually when paying in monthly installments as part of a financial promotion. According to CONC 3.5.3 R, this is the postal address at which the person making the financial promotion may be contacted."
        },
        "availableMarketingContactOptions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems",
          "description": "List of marketing contact options provided by the insurer."
        },
        "secciForm": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Standard European consumer credit information form, where applicable."
        },
        "creditAgreement": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem",
          "description": "Credit agreement."
        },
        "productInformation": {
          "typeRef": "#/domains/MotorInsurance/types/NullableStructuredTextItem",
          "description": "Information about the product."
        },
        "insurerSpecificDocuments": {
          "typeRef": "#/domains/Generic/types/StructuredTextItems",
          "description": "Dynamic list of documents and links insusrers add which may or not already be present in other outputs."
        },
        "availableDirectDebitPaymentDays": {
          "typeRef": "#/domains/MotorInsurance/types/AvailablePaymentDays",
          "description": "List of available DD payment days."
        },
        "availableCardPaymentDays": {
          "typeRef": "#/domains/MotorInsurance/types/AvailablePaymentDays",
          "description": "List of available card payment days."
        }
      },
      "types": {
        "QuoteReference": {
          "type": "string",
          "description": "Existing quote retrieval information.",
          "example": "ABC123"
        },
        "Quote": {
          "type": "object",
          "description": "Existing quote retrieval information.",
          "pii": true,
          "properties": {
            "reference": {
              "type": "string",
              "description": "Reference code.",
              "example": "ABC123"
            },
            "postcode": {
              "type": "string",
              "description": "UK post code",
              "example": "EC1R0AT"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Proposer's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "email": {
              "type": "string",
              "description": "Email address used to retrieve the quote.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [
            "reference",
            "postcode",
            "email",
            "dateOfBirth"
          ]
        },
        "PurchaseConfirmation": {
          "type": "object",
          "description": "Information gathered on the \"confirmation\" page.",
          "properties": {
            "purchaseReference": {
              "type": "string",
              "description": "Reference code grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "The confirmation message.",
              "example": "Thank you for using UBIO Insurance. Your quote is ABC123 and purchase reference is DEF456."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the confirmation page."
            }
          },
          "additionalProperties": false,
          "required": [
            "purchaseReference"
          ]
        },
        "Vehicle": {
          "type": "object",
          "description": "Information about the vehicle being insured.",
          "pii": true,
          "properties": {
            "registrationNumber": {
              "type": "string",
              "description": "Vehicle registration number (licence plate).",
              "example": "Y900MCL"
            },
            "make": {
              "type": "string",
              "description": "Vehicle make.",
              "example": "Audi"
            },
            "model": {
              "type": "string",
              "description": "Vehicle model.",
              "example": "SQ5 TDI"
            },
            "makeModel": {
              "type": "string",
              "description": "Vehicle combined make+model.",
              "example": "Audi SQ5 TDI"
            },
            "yearOfManufacture": {
              "type": "string",
              "description": "Vehicle year of manufacture",
              "example": "2013"
            }
          },
          "additionalProperties": false,
          "required": []
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features such as upsells and additional cover. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "legalCover": {
              "type": "boolean",
              "default": false
            },
            "excessProtectCover": {
              "type": "boolean",
              "default": false
            },
            "breakdownCover": {
              "type": "boolean",
              "default": false
            },
            "personalInjuryCover": {
              "type": "boolean",
              "default": false
            },
            "carHireCover": {
              "type": "boolean",
              "default": false
            },
            "noClaimsDiscountProtection": {
              "type": "boolean",
              "default": false
            },
            "windscreenCover": {
              "type": "boolean",
              "default": false
            },
            "keyReplacementCover": {
              "type": "boolean",
              "default": false
            },
            "misfuelCover": {
              "type": "boolean",
              "default": false
            },
            "account": {
              "type": "boolean",
              "default": false
            },
            "customerIpAddress": {
              "type": "string",
              "default": ""
            }
          }
        },
        "NullableAvailableCovers": {
          "oneOf": [
            {
              "$ref": "#/domains/MotorInsurance/types/AvailableCovers"
            },
            {
              "type": "null"
            }
          ]
        },
        "AvailableCovers": {
          "type": "array",
          "description": "A list of available cover options found on the page.",
          "minItems": 1,
          "maxItems": 40,
          "items": {
            "$ref": "#/domains/MotorInsurance/types/Cover"
          }
        },
        "SelectedCover": {
          "oneOf": [
            {
              "$ref": "#/domains/MotorInsurance/types/Cover"
            },
            {
              "type": "null"
            }
          ]
        },
        "SelectedItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredTextItems"
            },
            {
              "type": "null"
            }
          ]
        },
        "Cover": {
          "type": "object",
          "description": "Cover information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Cover marketing name as provided by the insurer.",
              "example": "European Plus"
            },
            "priceLine": {
              "type": "string",
              "description": "Cover price line.",
              "example": "Included."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "details": {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            }
          },
          "required": [
            "name"
          ]
        },
        "PolicyGroupInfo": {
          "type": "array",
          "description": "Group of information about the policy.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/MotorInsurance/types/PolicyGroupItem"
          }
        },
        "PolicyGroupItem": {
          "type": "object",
          "description": "Piece of information about the policy.",
          "properties": {
            "name": {
              "type": "string",
              "description": "Type of information as provided by the insurer.",
              "example": "Policy details"
            },
            "value": {
              "type": "string",
              "description": "Information details or url, where available.",
              "example": "https://www.example.com/documents/policy-details.pdf"
            }
          },
          "required": [
            "name",
            "value"
          ],
          "additionalProperties": false
        },
        "PaymentCardTypes": {
          "type": "array",
          "description": "List of payment card types.",
          "items": {
            "$ref": "#/domains/MotorInsurance/types/PaymentCardType"
          }
        },
        "PaymentCardType": {
          "type": "object",
          "description": "Type of card.",
          "properties": {
            "type": {
              "type": "string",
              "description": "Card type, debit or credit.",
              "enum": [
                "debit",
                "credit"
              ]
            },
            "brand": {
              "type": "string",
              "description": "Card brand, must be one of the supported card brands. Automation may fail if a specific card brand is not supported on a particular website.",
              "enum": [
                "visa",
                "mastercard",
                "amex",
                "discover"
              ]
            }
          },
          "required": [
            "type",
            "brand"
          ],
          "additionalProperties": false
        },
        "PaymentTerms": {
          "type": "array",
          "description": "List of payment terms.",
          "items": {
            "$ref": "#/domains/MotorInsurance/types/PaymentTerm"
          }
        },
        "PaymentTerm": {
          "type": "string",
          "description": "Payment term. The outlier is <strong>monthly-directdebit-card</strong>, which specifies that card payment must be used to pay the initial deposit, but direct debit must be set up for recurring monthly payments.",
          "enum": [
            "annual-card",
            "monthly-card",
            "monthly-directdebit",
            "monthly-directdebit-card"
          ]
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "selectedPaymentDay": {
              "type": "string",
              "description": "Preferred payment day, one of availableCardPaymentDays.",
              "example": "10"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "DirectDebitPayment": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "sortCode": {
              "type": "string",
              "description": "Bank sort code",
              "pattern": "\\d{2}-?\\d{2}-?\\d{2}",
              "example": "56-00-29"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 8,
              "maxLength": 8,
              "description": "Cover marketing name as provided by the insurer.",
              "example": "26207729"
            },
            "accountHolder": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "accountHolderAddress": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "selectedPaymentDay": {
              "type": "string",
              "description": "Preferred payment day, one of availableDirectDebitPaymentDays.",
              "example": "10"
            }
          },
          "required": [
            "sortCode",
            "accountNumber",
            "accountHolder",
            "accountHolderAddress"
          ],
          "additionalProperties": false
        },
        "AvailablePaymentDays": {
          "oneOf": [
            {
              "type": "array",
              "description": "List of payment days.",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "NullableStructuredTextItem": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/StructuredTextItem"
            },
            {
              "type": "null"
            }
          ]
        },
        "NullableAccount": {
          "oneOf": [
            {
              "$ref": "#/domains/Generic/types/Account"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "errors": [
        {
          "code": "QuoteNotFound",
          "category": "client",
          "description": "Given quote was not found by the insurer."
        },
        {
          "code": "LegalCoverNotFound",
          "category": "client",
          "description": "Given legal cover does not match one of the options we are expecting"
        },
        {
          "code": "BreakdownCoverNotFound",
          "category": "client",
          "description": "Given breakdown cover does not match one of the options we are expecting"
        },
        {
          "code": "PersonalInjuryCoverNotFound",
          "category": "client",
          "description": "Given personal injury cover does not match one of the options we are expecting"
        },
        {
          "code": "CarHireCoverNotFound",
          "category": "client",
          "description": "Given car hire cover does not match one of the options we are expecting"
        },
        {
          "code": "RegistrationNumberInvalid",
          "category": "client",
          "description": "Registration number is not accepted by the website"
        },
        {
          "code": "RegistrationNumberRequired",
          "category": "client",
          "description": "Registration number is required by the website"
        },
        {
          "code": "DirectDebitRejected",
          "category": "client",
          "description": "Direct debit details provided have been rejected by the website."
        },
        {
          "code": "PolicyAlreadyPurchased",
          "category": "client",
          "description": "The policy has already been purchased."
        }
      ]
    },
    "MotorInsuranceExtraction": {
      "description": "Internal domain for generating MotorInsurance inputs.",
      "private": true,
      "inputs": {
        "options": {
          "typeRef": "#/domains/MotorInsurance/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL"
        },
        "cookies": {
          "typeRef": "#/domains/Generic/types/Cookies"
        }
      },
      "types": {},
      "errors": []
    },
    "PetInsurance": {
      "description": "",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "pets": {
          "typeRef": "#/domains/PetInsurance/types/Pets"
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account"
        },
        "applicant": {
          "typeRef": "#/domains/PetInsurance/types/Applicant"
        },
        "directDebit": {
          "typeRef": "#/domains/PetInsurance/types/DirectDebit"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided."
        },
        "cover": {
          "typeRef": "#/domains/PetInsurance/types/SelectedOptions"
        },
        "coverStartDate": {
          "typeRef": "#/domains/PetInsurance/types/CoverStartDate"
        },
        "selectedPaymentMethod": {
          "typeRef": "#/domains/PetInsurance/types/PaymentMethod"
        },
        "selectedUserDeclarations": {
          "typeRef": "#/domains/PetInsurance/types/AvailableUserDeclarations"
        },
        "selectedTermsAndConditions": {
          "typeRef": "#/domains/PetInsurance/types/AvailableTermsAndConditions"
        },
        "selectedAdditionalUserDeclarations": {
          "typeRef": "#/domains/PetInsurance/types/AvailableUserDeclarations"
        },
        "selectedAdditionalTermsAndConditions": {
          "typeRef": "#/domains/PetInsurance/types/AvailableTermsAndConditions"
        },
        "optionalExtras": {
          "typeRef": "#/domains/PetInsurance/types/OptionalExtras"
        },
        "selectedPackages": {
          "typeRef": "#/domains/PetInsurance/types/SelectedPackages"
        }
      },
      "outputs": {
        "coverValues": {
          "typeRef": "#/domains/PetInsurance/types/AvailableOptions"
        },
        "availablePackages": {
          "typeRef": "#/domains/PetInsurance/types/AvailablePackages"
        },
        "availablePaymentMethods": {
          "typeRef": "#/domains/PetInsurance/types/AvailablePaymentMethods"
        },
        "availableUserDeclarations": {
          "typeRef": "#/domains/PetInsurance/types/AvailableUserDeclarations"
        },
        "availableTermsAndConditions": {
          "typeRef": "#/domains/PetInsurance/types/AvailableTermsAndConditions"
        },
        "availableAdditionalUserDeclarations": {
          "typeRef": "#/domains/PetInsurance/types/AvailableUserDeclarations"
        },
        "availableAdditionalTermsAndConditions": {
          "typeRef": "#/domains/PetInsurance/types/AvailableTermsAndConditions"
        },
        "estimatedQuote": {
          "typeRef": "#/domains/PetInsurance/types/QuoteValue"
        },
        "quote": {
          "typeRef": "#/domains/PetInsurance/types/QuoteValue"
        },
        "documents": {
          "typeRef": "#/domains/PetInsurance/types/Documents"
        },
        "registrationDocs": {
          "typeRef": "#/domains/PetInsurance/types/Documents"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "confirmation": {
          "typeRef": "#/domains/PetInsurance/types/Confirmation"
        }
      },
      "types": {
        "Pets": {
          "type": "array",
          "description": "An array of Bike objects.",
          "items": {
            "$ref": "#/domains/PetInsurance/types/Pet"
          },
          "minItems": 1
        },
        "Pet": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "animalType": {
              "type": "string",
              "enum": [
                "dog",
                "cat"
              ]
            },
            "gender": {
              "type": "string",
              "enum": [
                "male",
                "female"
              ]
            },
            "breedType": {
              "type": "string",
              "enum": [
                "pedigree",
                "cross breed",
                "mongrel"
              ]
            },
            "breedName": {
              "type": "string",
              "enum": [
                "Affenpinscher",
                "Afghan Hound",
                "Afghan Shepherd",
                "Aidi",
                "Airedale Terrier",
                "Akbash",
                "Akita",
                "Alano Español",
                "Alaskan husky",
                "Alaskan Klee Kai",
                "Alaskan Malamute",
                "Alaunt",
                "Alopekis",
                "Alpine Dachsbracke",
                "Alpine Mastiff",
                "Alpine Spaniel",
                "American Akita",
                "American Bully",
                "American Bulldog",
                "American Cocker Spaniel",
                "American English Coonhound",
                "American Eskimo Dog",
                "American Foxhound",
                "American Hairless Terrier",
                "American Pit Bull Terrier",
                "American Staffordshire Terrier",
                "American Water Spaniel",
                "Anatolian Shepherd Dog",
                "Andalusian Hound",
                "Anglo-Français de Petite Vénerie",
                "Appenzeller Sennenhund",
                "Argentine Polar Dog",
                "Ariegeois",
                "Armant",
                "Armenian Gampr dog",
                "Artois Hound",
                "Australian Cattle Dog",
                "Australian Kelpie",
                "Australian Shepherd",
                "Australian Stumpy Tail Cattle Dog",
                "Australian Terrier",
                "Austrian Black and Tan Hound",
                "Austrian Pinscher",
                "Azawakh",
                "Bakharwal dog",
                "Barbado da Terceira",
                "Barbet",
                "Basenji",
                "Basque Shepherd Dog",
                "Basset Artésien Normand",
                "Basset Bleu de Gascogne",
                "Basset Fauve de Bretagne",
                "Basset Hound",
                "Bavarian Mountain Hound",
                "Beagle",
                "Beagle-Harrier",
                "Bearded Collie",
                "Beauceron",
                "Bedlington Terrier",
                "Belgian Shepherd Dog (Groenendael)",
                "Belgian Shepherd Dog (Laekenois)",
                "Belgian Shepherd Dog (Malinois)",
                "Belgian Shepherd Dog (Tervuren)",
                "Bergamasco Shepherd",
                "Berger Blanc Suisse",
                "Berger Picard",
                "Bernese Mountain Dog",
                "Bichon Frisé",
                "Billy",
                "Black and Tan Coonhound",
                "Black and Tan Virginia Foxhound",
                "Black Norwegian Elkhound",
                "Black Russian Terrier",
                "Black Mouth Cur",
                "Bloodhound",
                "Blue Heeler",
                "Blue Lacy",
                "Blue Paul Terrier",
                "Blue Picardy Spaniel",
                "Bluetick Coonhound",
                "Boerboel",
                "Bohemian Shepherd",
                "Bolognese",
                "Border Collie",
                "Border Terrier",
                "Borzoi",
                "Bosnian Coarse-haired Hound",
                "Boston Terrier",
                "Bouvier des Ardennes",
                "Bouvier des Flandres",
                "Boxer",
                "Boykin Spaniel",
                "Bracco Italiano",
                "Braque d'Auvergne",
                "Braque de l'Ariege",
                "Braque du Bourbonnais",
                "Braque du Puy",
                "Braque Francais",
                "Braque Saint-Germain",
                "Brazilian Dogo",
                "Brazilian Terrier",
                "Briard",
                "Briquet Griffon Vendéen",
                "Brittany",
                "Broholmer",
                "Bruno Jura Hound",
                "Brussels Griffon",
                "Bucovina Shepherd Dog",
                "Bull and Terrier",
                "Bull Terrier",
                "Bulldog",
                "Bullenbeisser",
                "Bullmastiff",
                "Bully Kutta",
                "Burgos Pointer",
                "Cairn Terrier",
                "Canaan Dog",
                "Canadian Eskimo Dog",
                "Cane Corso",
                "Cantabrian Water Dog",
                "Cão da Serra de Aires",
                "Cão de Castro Laboreiro",
                "Cão de Gado Transmontano",
                "Cão Fila de São Miguel",
                "Carolina Dog",
                "Carpathian Shepherd Dog",
                "Catalan Sheepdog",
                "Caucasian Shepherd Dog",
                "Cavalier King Charles Spaniel",
                "Celtic Hound",
                "Central Asian Shepherd Dog",
                "Cesky Fousek",
                "Cesky Terrier",
                "Chesapeake Bay Retriever",
                "Chien Français Blanc et Noir",
                "Chien Français Blanc et Orange",
                "Chien Français Tricolore",
                "Chien-gris",
                "Chihuahua",
                "Chilean Terrier",
                "Chinese Chongqing Dog",
                "Chinese Crested Dog",
                "Chinese Imperial Dog",
                "Chinook",
                "Chippiparai",
                "Chiribaya Dog",
                "Chow Chow",
                "Cierny Sery",
                "Cirneco dell'Etna",
                "Clumber Spaniel",
                "Collie, Rough",
                "Collie, Smooth",
                "Combai",
                "Cordoba Fighting Dog",
                "Coton de Tulear",
                "Cretan Hound",
                "Croatian Sheepdog",
                "Cumberland Sheepdog",
                "Curly-Coated Retriever",
                "Cursinu",
                "Czechoslovakian Wolfdog",
                "Dachshund",
                "Dalbo dog",
                "Dalmatian",
                "Dandie Dinmont Terrier",
                "Danish-Swedish Farmdog",
                "Deutsche Bracke",
                "Doberman Pinscher",
                "Dogo Argentino",
                "Dogo Cubano",
                "Dogue de Bordeaux",
                "Drentse Patrijshond",
                "Drever",
                "Dunker",
                "Dutch Shepherd",
                "Dutch Smoushond",
                "East Siberian Laika",
                "East European Shepherd",
                "Elo",
                "English Cocker Spaniel",
                "English Foxhound",
                "English Mastiff",
                "English Pointer",
                "English Setter",
                "English Shepherd",
                "English Springer Spaniel",
                "English Toy Terrier (Black & Tan)",
                "English Water Spaniel",
                "English White Terrier",
                "Entlebucher Mountain Dog",
                "Estonian Hound",
                "Estrela Mountain Dog",
                "Eurasier",
                "Eurohound",
                "Field Spaniel",
                "Fila Brasileiro",
                "Finnish Hound",
                "Finnish Lapphund",
                "Finnish Spitz",
                "Flat-Coated Retriever",
                "Fox Terrier, Smooth",
                "Fox Terrier, Wire",
                "French Brittany",
                "French Bulldog",
                "French Spaniel",
                "Gaddi Kutta",
                "Galgo Español",
                "Galician Shepherd Dog",
                "Garafian Shepherd",
                "Gascon Saintongeois",
                "Georgian Shepherd",
                "German Longhaired Pointer",
                "German Pinscher",
                "German Roughhaired Pointer",
                "German Shepherd Dog",
                "German Shorthaired Pointer",
                "German Spaniel",
                "German Spitz",
                "German Wirehaired Pointer",
                "Giant Schnauzer",
                "Glen of Imaal Terrier",
                "Golden Retriever",
                "Gordon Setter",
                "Gran Mastín de Borínquen",
                "Grand Anglo-Français Blanc et Noir",
                "Grand Anglo-Français Blanc et Orange",
                "Grand Anglo-Français Tricolore",
                "Grand Basset Griffon Vendéen",
                "Grand Bleu de Gascogne",
                "Grand Griffon Vendéen",
                "Great Dane",
                "Great Pyrenees",
                "Greater Swiss Mountain Dog",
                "Greek Harehound",
                "Greek Shepherd",
                "Greenland Dog",
                "Greyhound",
                "Griffon Bleu de Gascogne",
                "Griffon Fauve de Bretagne",
                "Griffon Nivernais",
                "Guatemalan Dogo",
                "Gull Terrier",
                "Hamiltonstövare",
                "Hanover Hound",
                "Hare Indian Dog",
                "Harrier",
                "Havanese",
                "Hawaiian Poi Dog",
                "Himalayan Sheepdog",
                "Hokkaido",
                "Hortaya borzaya",
                "Hovawart",
                "Huntaway",
                "Hygen Hound",
                "Ibizan Hound",
                "Icelandic Sheepdog",
                "Indian pariah dog",
                "Indian Spitz",
                "Irish Red and White Setter",
                "Irish Setter",
                "Irish Terrier",
                "Irish Water Spaniel",
                "Irish Wolfhound",
                "Istrian Coarse-haired Hound",
                "Istrian Short-haired Hound",
                "Italian Greyhound",
                "Jack Russell Terrier",
                "Jagdterrier",
                "Swedish Elkhound",
                "Japanese Chin",
                "Japanese Spitz",
                "Japanese Terrier",
                "Jindo",
                "Jonangi",
                "Kaikadi dog",
                "Kai Ken",
                "Kangal Shepherd Dog",
                "Kanni",
                "Karakachan dog",
                "Karelian Bear Dog",
                "Karst Shepherd",
                "Keeshond",
                "Kerry Beagle",
                "Kerry Blue Terrier",
                "King Charles Spaniel",
                "King Shepherd",
                "Kintamani",
                "Kishu Ken",
                "Komondor",
                "Koolie",
                "Koyun dog",
                "Kromfohrländer",
                "Kumaon Mastiff",
                "Kunming Wolfdog",
                "Kurī",
                "Kuvasz",
                "Kyi-Leo",
                "Labrador Husky",
                "Labrador Retriever",
                "Lagotto Romagnolo",
                "Lakeland Terrier",
                "Lancashire Heeler",
                "Landseer",
                "Lapponian Herder",
                "Lapponian Shepherd",
                "Large Münsterländer",
                "Leonberger",
                "Lhasa Apso",
                "Lithuanian Hound",
                "Louisiana Catahoula Leopard Dog",
                "Löwchen",
                "Mackenzie River husky",
                "Magyar agár",
                "Mahratta Greyhound",
                "Maltese",
                "Maremma Sheepdog",
                "Marquesan Dog",
                "McNab dog",
                "Miniature American Shepherd",
                "Miniature Bull Terrier",
                "Miniature Fox Terrier",
                "Miniature Pinscher",
                "Miniature Schnauzer",
                "Miniature Shar Pei",
                "Molossus",
                "Molossus of Epirus",
                "Montenegrin Mountain Hound",
                "Moscow Watchdog",
                "Moscow Water Dog",
                "Mountain Cur",
                "Mucuchies",
                "Mudhol Hound",
                "Mudi",
                "Neapolitan Mastiff",
                "Nederlandse Kooikerhondje",
                "Nenets Herding Laika",
                "Newfoundland",
                "New Guinea singing dog",
                "New Zealand Heading Dog",
                "Norfolk Spaniel",
                "Norfolk Terrier",
                "Norrbottenspets",
                "North Country Beagle",
                "Northern Inuit Dog",
                "Norwegian Buhund",
                "Norwegian Elkhound",
                "Norwegian Lundehund",
                "Norwich Terrier",
                "Nova Scotia Duck Tolling Retriever",
                "Old Croatian Sighthound",
                "Old Danish Pointer",
                "Old English Bulldog",
                "Old English Sheepdog",
                "Old English Terrier",
                "Old German Shepherd Dog",
                "Old Spanish Pointer",
                "Old Time Farm Shepherd",
                "Old Welsh Grey Sheepdog",
                "Olde English Bulldogge",
                "Otterhound",
                "Pachon Navarro",
                "Pandikona",
                "Paisley Terrier",
                "Papillon",
                "Parson Russell Terrier",
                "Pastore della Lessinia e del Lagorai",
                "Patterdale Terrier",
                "Pekingese",
                "Perro de Pastor Mallorquin",
                "Perro de Presa Canario",
                "Perro de Presa Mallorquin",
                "Peruvian Inca Orchid",
                "Petit Basset Griffon Vendéen",
                "Petit Bleu de Gascogne",
                "Phalène",
                "Pharaoh Hound",
                "Phu Quoc Ridgeback",
                "Picardy Spaniel",
                "Plummer Terrier",
                "Plott Hound",
                "Podenco Canario",
                "Poitevin",
                "Polish Greyhound",
                "Polish Hound",
                "Polish Hunting Dog",
                "Polish Lowland Sheepdog",
                "Polish Tatra Sheepdog",
                "Pomeranian",
                "Pont-Audemer Spaniel",
                "Poodle",
                "Porcelaine",
                "Portuguese Podengo",
                "Portuguese Pointer",
                "Portuguese Water Dog",
                "Posavac Hound",
                "Potsdam Greyhound",
                "Pražský Krysařík",
                "Pudelpointer",
                "Pug",
                "Puli",
                "Pumi",
                "Pungsan dog",
                "Pyrenean Mastiff",
                "Pyrenean Shepherd",
                "Rafeiro do Alentejo",
                "Rajapalayam",
                "Rampur Greyhound",
                "Rastreador Brasileiro",
                "Rat Terrier",
                "Ratonero Bodeguero Andaluz",
                "Ratonero Mallorquin",
                "Ratonero Murciano de Huerta",
                "Ratonero Valenciano",
                "Redbone Coonhound",
                "Rhodesian Ridgeback",
                "Romanian Mioritic Shepherd Dog",
                "Romanian Raven Shepherd Dog",
                "Rottweiler",
                "Russian Salon Dog",
                "Russian Spaniel",
                "Russian Toy",
                "Russian Tracker",
                "Russo-European Laika",
                "Russell Terrier",
                "Saarloos Wolfdog",
                "Sabueso Español",
                "Sabueso fino Colombiano",
                "Saint Bernard",
                "Saint John's water dog",
                "Saint-Usuge Spaniel",
                "Sakhalin Husky",
                "Salish Wool Dog",
                "Saluki",
                "Samoyed",
                "Sapsali",
                "Šarplaninac",
                "Schapendoes",
                "Schillerstövare",
                "Schipperke",
                "Schweizer Laufhund",
                "Schweizerischer Niederlaufhund",
                "Scotch Collie",
                "Scottish Deerhound",
                "Scottish Terrier",
                "Sealyham Terrier",
                "Segugio Italiano",
                "Segugio Maremmano",
                "Seppala Siberian Sleddog",
                "Serbian Hound",
                "Serbian Tricolour Hound",
                "Seskar Seal Dog",
                "Shar Pei",
                "Shetland Sheepdog",
                "Shiba Inu",
                "Shih Tzu",
                "Shikoku",
                "Shiloh Shepherd",
                "Siberian Husky",
                "Silken Windhound",
                "Silky Terrier",
                "Sinhala Hound",
                "Skye Terrier",
                "Sloughi",
                "Slovakian Wirehaired Pointer",
                "Slovensky Cuvac",
                "Slovensky Kopov",
                "Smålandsstövare",
                "Small Münsterländer",
                "Small Greek Domestic Dog",
                "Smithfield",
                "Soft-Coated Wheaten Terrier",
                "South Russian Ovcharka",
                "Southern Hound",
                "Spanish Mastiff",
                "Spanish Water Dog",
                "Spinone Italiano",
                "Sporting Lucas Terrier",
                "Stabyhoun",
                "Staffordshire Bull Terrier",
                "Standard Manchester Terrier",
                "Standard Schnauzer",
                "Stephens Cur",
                "Styrian Coarse-haired Hound",
                "Sussex Spaniel",
                "Swedish Lapphund",
                "Swedish Vallhund",
                "Tahitian Dog",
                "Tahltan Bear Dog",
                "Taigan",
                "Taiwan Dog",
                "Talbot Hound",
                "Tamaskan Dog",
                "Teddy Roosevelt Terrier",
                "Telomian",
                "Tenterfield Terrier",
                "Terceira Mastiff",
                "Thai Bangkaew Dog",
                "Thai Ridgeback",
                "Tibetan Mastiff",
                "Tibetan Spaniel",
                "Tibetan Terrier",
                "Tornjak",
                "Tosa",
                "Toy Bulldog",
                "Toy Fox Terrier",
                "Toy Manchester Terrier",
                "Toy Trawler Spaniel",
                "Transylvanian Hound",
                "Treeing Cur",
                "Treeing Tennessee Brindle",
                "Treeing Walker Coonhound",
                "Trigg Hound",
                "Turnspit",
                "Tweed Water Spaniel",
                "Tyrolean Hound",
                "Cimarrón Uruguayo",
                "Vanjari Hound",
                "Villano de Las Encartaciones",
                "Villanuco de Las Encartaciones",
                "Vizsla",
                "Volpino Italiano",
                "Weimaraner",
                "Welsh Corgi, Cardigan",
                "Welsh Corgi, Pembroke",
                "Welsh Hillman",
                "Welsh Sheepdog",
                "Welsh Springer Spaniel",
                "Welsh Terrier",
                "West Highland White Terrier",
                "West Siberian Laika",
                "Westphalian Dachsbracke",
                "Wetterhoun",
                "Whippet",
                "White Shepherd",
                "Wirehaired Pointing Griffon",
                "Wirehaired Vizsla",
                "Xiasi Dog",
                "Xoloitzcuintli",
                "Yakutian Laika",
                "Yorkshire Terrier",
                "Abyssinian",
                "Aegean",
                "American Curl",
                "American Bobtail",
                "American Shorthair",
                "American Wirehair",
                "Arabian Mau",
                "Australian Mist",
                "Asian",
                "Asian Semi-longhair",
                "Balinese",
                "Bambino",
                "Bengal",
                "Birman",
                "Bombay",
                "Brazilian Shorthair",
                "British Semi-longhair",
                "British Shorthair",
                "British Longhair",
                "Burmese",
                "Burmilla",
                "Chantilly-Tiffany",
                "Chartreux",
                "Chausie",
                "Cheetoh",
                "Colorpoint Shorthair",
                "Javanese",
                "Cornish Rex",
                "Cymric",
                "Cyprus",
                "Egyptian Mau",
                "European Shorthair",
                "Exotic Shorthair",
                "German Rex",
                "Havana Brown",
                "Himalayan",
                "Japanese Bobtail",
                "Khao Manee",
                "Korat",
                "Korean Bobtail",
                "Kurilian Bobtail",
                "LaPerm",
                "Lykoi",
                "Maine Coon",
                "Manx",
                "Minskin",
                "Munchkin",
                "Nebelung",
                "Napoleon",
                "Norwegian Forest Cat",
                "Ocicat",
                "Ojos Azules",
                "Oregon Rex",
                "Oriental Bicolor",
                "Oriental Shorthair",
                "Oriental Longhair",
                "Pixie-bob",
                "Raas",
                "Ragamuffin",
                "Russian Blue",
                "Savannah",
                "Selkirk Rex",
                "Serengeti",
                "Siamese",
                "Thai",
                "Siberian",
                "Singapura",
                "Snowshoe",
                "Sokoke",
                "Somali",
                "Sphynx",
                "Suphalak",
                "Thai Lilac",
                "Tonkinese",
                "Toyger",
                "Turkish Angora",
                "Turkish Van",
                "York Chocolate"
              ]
            },
            "secondaryBreed": {
              "type": "string"
            },
            "size": {
              "type": "string",
              "enum": [
                "small",
                "medium",
                "large"
              ]
            },
            "isNeutered": {
              "type": "boolean"
            },
            "isChipped": {
              "type": "boolean"
            },
            "isVaccinated": {
              "type": "boolean"
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "description": "Date of birth YYYY-MM-DD.",
              "example": "1980-01-01"
            },
            "petPrice": {
              "type": "integer"
            },
            "hasExistingConditions": {
              "type": "boolean"
            }
          },
          "required": [
            "name",
            "animalType",
            "breedType",
            "isNeutered",
            "isChipped",
            "isVaccinated",
            "dateOfBirth",
            "petPrice",
            "hasExistingConditions"
          ],
          "additionalProperties": false
        },
        "Applicant": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "type": "object",
              "description": "Basic information about person's identity.",
              "pii": true,
              "properties": {
                "title": {
                  "type": "string",
                  "description": "",
                  "enum": [
                    "mr",
                    "miss",
                    "ms",
                    "mrs"
                  ]
                },
                "firstName": {
                  "type": "string",
                  "description": "First name(s) or given name(s), as specified in ID.",
                  "minLength": 1,
                  "example": "Bob"
                },
                "lastName": {
                  "type": "string",
                  "description": "Last name or surname, as specified in ID.",
                  "minLength": 1,
                  "example": "Smith"
                },
                "dateOfBirth": {
                  "type": "string",
                  "format": "date",
                  "description": "Date of birth YYYY-MM-DD.",
                  "example": "1980-01-01"
                },
                "email": {
                  "type": "string",
                  "format": "email",
                  "example": "hello@example.com"
                },
                "phone": {
                  "$ref": "#/domains/Generic/types/Phone"
                }
              },
              "required": [
                "title",
                "firstName",
                "lastName",
                "dateOfBirth",
                "email",
                "phone"
              ],
              "additionalProperties": false
            },
            "address": {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            }
          },
          "required": [
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "DirectDebit": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "sortCode": {
              "type": "string",
              "description": "Bank sort code",
              "pattern": "\\d{2}-?\\d{2}-?\\d{2}",
              "example": "56-00-29"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 8,
              "maxLength": 8,
              "description": "Cover marketing name as provided by the insurer.",
              "example": "26207729"
            },
            "accountName": {
              "type": "string",
              "minLength": 1
            },
            "bankName": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "sortCode",
            "accountNumber",
            "accountName",
            "bankName"
          ],
          "additionalProperties": false
        },
        "AvailablePaymentMethods": {
          "type": "array",
          "description": "An array of PaymentMethod objects.",
          "items": {
            "$ref": "#/domains/PetInsurance/types/PaymentMethod"
          },
          "minItems": 1
        },
        "AvailableUserDeclarations": {
          "type": "array",
          "items": {
            "$ref": "#/domains/PetInsurance/types/DeclarationOrCondition"
          }
        },
        "AvailableTermsAndConditions": {
          "type": "array",
          "items": {
            "$ref": "#/domains/PetInsurance/types/DeclarationOrCondition"
          }
        },
        "DeclarationOrCondition": {
          "type": "object",
          "properties": {
            "label": {
              "type": "string"
            },
            "text": {
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "inputType": {
              "type": "string",
              "enum": [
                "String",
                "SelectMany",
                "SelectOne",
                "Boolean"
              ]
            },
            "option": {
              "$ref": "#/domains/PetInsurance/types/Option"
            },
            "options": {
              "$ref": "#/domains/PetInsurance/types/Strings"
            }
          },
          "required": [
            "label",
            "inputType"
          ],
          "additionalProperties": false
        },
        "Option": {
          "oneOf": [
            {
              "type": "boolean"
            },
            {
              "type": "string"
            }
          ]
        },
        "PaymentMethod": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "annually",
                "monthly"
              ]
            },
            "method": {
              "type": "string",
              "enum": [
                "direct-debit",
                "credit-card"
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "type",
            "method",
            "price"
          ],
          "additionalProperties": false
        },
        "QuoteValue": {
          "type": "object",
          "properties": {
            "monthly": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "annually": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about the successful operation."
            }
          },
          "required": [
            "message"
          ],
          "additionalProperties": false
        },
        "OptionalExtras": {
          "type": "object",
          "properties": {},
          "required": [],
          "additionalProperties": true
        },
        "AvailablePackages": {
          "type": "array",
          "items": {
            "$ref": "#/domains/PetInsurance/types/AvailablePackage"
          },
          "minItems": 1
        },
        "AvailablePackage": {
          "type": "object",
          "properties": {
            "petName": {
              "type": "string",
              "minLength": 1
            },
            "packages": {
              "$ref": "#/domains/PetInsurance/types/Packages"
            }
          },
          "required": [
            "petName"
          ],
          "additionalProperties": true
        },
        "SelectedPackages": {
          "type": "array",
          "items": {
            "$ref": "#/domains/PetInsurance/types/SelectedPackage"
          },
          "minItems": 1
        },
        "SelectedPackage": {
          "type": "object",
          "properties": {
            "petName": {
              "type": "string",
              "minLength": 1
            },
            "package": {
              "$ref": "#/domains/PetInsurance/types/Package"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": true
        },
        "Packages": {
          "type": "array",
          "description": "An array of Package objects.",
          "items": {
            "$ref": "#/domains/PetInsurance/types/Package"
          },
          "minItems": 1
        },
        "Package": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "description": {
              "type": "string",
              "minLength": 1
            },
            "monthly": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "annually": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "benefits": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": true
        },
        "Documents": {
          "type": "array",
          "description": "An array of Link objects.",
          "items": {
            "$ref": "#/domains/Generic/types/Link"
          },
          "minItems": 1
        },
        "AvailableOptions": {
          "type": "array",
          "description": "Additional options to be filled in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/PetInsurance/types/AvailableOptionString"
              },
              {
                "$ref": "#/domains/PetInsurance/types/AvailableOptionBoolean"
              },
              {
                "$ref": "#/domains/PetInsurance/types/AvailableOptionSelectOne"
              },
              {
                "$ref": "#/domains/PetInsurance/types/AvailableOptionSelectMany"
              }
            ]
          }
        },
        "AvailableOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "Boolean"
              ]
            },
            "label": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "AvailableOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "SelectedOptions": {
          "type": "array",
          "description": "Additional options to fill in.",
          "items": {
            "anyOf": [
              {
                "$ref": "#/domains/PetInsurance/types/SelectedOptionString"
              },
              {
                "$ref": "#/domains/PetInsurance/types/SelectedOptionBoolean"
              },
              {
                "$ref": "#/domains/PetInsurance/types/SelectedOptionSelectOne"
              },
              {
                "$ref": "#/domains/PetInsurance/types/SelectedOptionSelectMany"
              }
            ]
          }
        },
        "SelectedOptionString": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "text": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "text"
          ],
          "additionalProperties": false
        },
        "SelectedOptionBoolean": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "String"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "type": "boolean"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectOne": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectOne"
              ]
            },
            "label": {
              "type": "string"
            },
            "option": {
              "type": "string"
            }
          },
          "required": [
            "inputType",
            "label",
            "option"
          ],
          "additionalProperties": false
        },
        "SelectedOptionSelectMany": {
          "type": "object",
          "properties": {
            "inputType": {
              "enum": [
                "SelectMany"
              ]
            },
            "label": {
              "type": "string"
            },
            "options": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "inputType",
            "label",
            "options"
          ],
          "additionalProperties": false
        },
        "CoverStartDate": {
          "type": "string",
          "format": "date",
          "description": "The date the cover starts on.",
          "example": "1980-01-01"
        },
        "Strings": {
          "type": "array",
          "items": {
            "$ref": "#/domains/PetInsurance/types/String"
          }
        },
        "String": {
          "type": "string"
        }
      },
      "errors": []
    },
    "PriceScrapingPages": {
      "description": "",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/PriceScrapingPages/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "landingPagePrice": {
          "typeRef": "#/domains/PriceScrapingPages/types/PriceScrapingPages"
        },
        "itemPricePage": {
          "typeRef": "#/domains/PriceScrapingPages/types/PriceScrapingPages"
        },
        "priceBreakdown": {
          "typeRef": "#/domains/PriceScrapingPages/types/PriceBreakdown"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "PriceScrapingPages": {
          "type": "object",
          "properties": {
            "originalPrice": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          }
        },
        "PriceBreakdown": {
          "type": "object",
          "properties": {
            "description": {
              "type": "string",
              "description": "The description of an item on the price breakdown list, as found on the website.",
              "example": "Credit card charge"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          }
        }
      },
      "errors": []
    },
    "ProductPurchase": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "orderConfirmation",
        "valuePath": "/orderReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "attributes": {
          "typeRef": "#/domains/ProductPurchase/types/Attributes",
          "description": "Product attributes such as size, colour, quantity/amount, type e.t.c.",
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/ProductPurchase/types/Account",
          "description": "Name and contact details.",
          "canonical": [
            "/contact/email"
          ]
        },
        "deliveryAddress": {
          "typeRef": "#/domains/Generic/types/Address"
        },
        "payment": {
          "typeRef": "#/domains/ProductPurchase/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        }
      },
      "outputs": {
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "orderConfirmation": {
          "typeRef": "#/domains/ProductPurchase/types/OrderConfirmation"
        }
      },
      "types": {
        "Attributes": {
          "type": "object",
          "default": {}
        },
        "Account": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/ProductPurchase/types/Person"
            },
            "contact": {
              "$ref": "#/domains/ProductPurchase/types/Contact"
            }
          },
          "required": [
            "person",
            "contact"
          ],
          "additionalProperties": false
        },
        "Contact": {
          "type": "object",
          "properties": {
            "phone": {
              "$ref": "#/domains/Generic/types/AnyPhoneString"
            },
            "email": {
              "type": "string",
              "description": "Contact email address.",
              "format": "email",
              "example": "mail@example.com"
            }
          },
          "required": [
            "phone",
            "email"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "person": {
              "$ref": "#/domains/ProductPurchase/types/Person"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        },
        "OrderConfirmation": {
          "type": "object",
          "description": "Information gathered on success purchase page.",
          "properties": {
            "orderReference": {
              "type": "string",
              "description": "Order reference grabbed from the page.",
              "example": "SUCCESS"
            },
            "message": {
              "type": "string",
              "description": "Message about successful purchase.",
              "example": "Your purchase was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful purchase page."
            }
          },
          "additionalProperties": false,
          "required": [
            "orderReference"
          ]
        }
      },
      "errors": [
        {
          "code": "ProductOutOfStock",
          "category": "client",
          "description": "Product is out of stock."
        }
      ]
    },
    "PropertyBooking": {
      "description": "Allows automating property booking.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "options": {
          "typeRef": "#/domains/PropertyBooking/types/Options",
          "default": {},
          "initial": true
        },
        "mainGuest": {
          "typeRef": "#/domains/PropertyBooking/types/MainGuest",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/person",
            "/contact/email"
          ]
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        }
      },
      "outputs": {
        "property": {
          "typeRef": "#/domains/PropertyBooking/types/Property"
        },
        "termsAndConditions": {
          "typeRef": "#/domains/Generic/types/StructuredTextItem"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/PropertyBooking/types/BookingConfirmation"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        }
      },
      "types": {
        "Property": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "priceBreakdown": {
              "typeRef": "#/domains/Generic/types/StructuredTextItems"
            },
            "dates": {
              "type": "object",
              "properties": {
                "checkin": {
                  "type": "string",
                  "format": "date",
                  "example": "2008-01-01"
                },
                "checkout": {
                  "type": "string",
                  "format": "date",
                  "example": "2008-01-01"
                }
              },
              "required": [
                "checkin",
                "checkout"
              ],
              "additionalProperties": false
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            }
          },
          "required": [
            "name",
            "price",
            "dates"
          ],
          "additionalProperties": false
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/Generic/types/Person"
            },
            "contact": {
              "$ref": "#/domains/PropertyBooking/types/GuestContact"
            },
            "address": {
              "$ref": "#/domains/Generic/types/ExplicitAddress"
            }
          },
          "required": [
            "person",
            "contact"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "email": {
              "type": "string",
              "description": "Email address used for contact.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [
            "phone",
            "email"
          ],
          "additionalProperties": false
        },
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        }
      },
      "errors": [
        {
          "code": "DepositNotFound",
          "category": "client",
          "description": "Given deposit option does not match one of the options we are expecting"
        },
        {
          "code": "PetOptionInvalid",
          "category": "client",
          "description": "Given pet option does not match one of the options we are expecting"
        },
        {
          "code": "PetOptionNotAvailable",
          "category": "client",
          "description": "Pet option is not available"
        },
        {
          "code": "GuestCountInvalid",
          "category": "client",
          "description": "Number of guests is not accepted by the website"
        },
        {
          "code": "GuestAgeInvalid",
          "category": "client",
          "description": "Guest age is not accepted by the website"
        },
        {
          "code": "PropertyRentalNotAvailable",
          "category": "client",
          "description": "Property rental is not found",
          "example": "Property rental unavailable on given date provided"
        }
      ]
    },
    "QRCodeExtraction": {
      "description": "Allows QR code data extraction from different types of files",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        }
      },
      "outputs": {
        "qrCodeContent": {
          "typeRef": "#/domains/QRCodeExtraction/types/CodeContents"
        }
      },
      "types": {
        "CodeContents": {
          "type": "array",
          "description": "",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/QRCodeExtraction/types/CodeContent"
          }
        },
        "CodeContent": {
          "type": "object",
          "description": "",
          "additionalProperties": false,
          "properties": {
            "content": {
              "type": "string"
            }
          },
          "required": []
        }
      },
      "errors": []
    },
    "Remittance": {
      "description": "Allows a payment of money that is transferred to another party",
      "private": false,
      "successCode": {
        "outputKey": "confirmation",
        "valuePath": "/reference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
          "initial": true
        },
        "options": {
          "typeRef": "#/domains/Remittance/types/Options",
          "default": {},
          "initial": true
        },
        "account": {
          "typeRef": "#/domains/Remittance/types/Account"
        },
        "confirmAccount": {
          "typeRef": "#/domains/Remittance/types/AccountConfirmation"
        },
        "sender": {
          "typeRef": "#/domains/Remittance/types/Sender"
        },
        "recipient": {
          "typeRef": "#/domains/Remittance/types/Recipient"
        },
        "directDebit": {
          "typeRef": "#/domains/Remittance/types/DirectDebit"
        },
        "selectedAccountType": {
          "typeRef": "#/domains/Remittance/types/AccountType",
          "sourceOutputKey": "availableAccountTypes",
          "inputMethod": "SelectOne"
        },
        "payment": {
          "typeRef": "#/domains/Remittance/types/Payment"
        },
        "alternativeBillingAddress": {
          "typeRef": "#/domains/Generic/types/Address"
        },
        "selectedPaymentMethod": {
          "typeRef": "#/domains/Remittance/types/PaymentMethod",
          "sourceOutputKey": "availablePaymentMethods",
          "inputMethod": "SelectOne"
        },
        "selectedSendingReason": {
          "typeRef": "#/domains/Remittance/types/String",
          "sourceOutputKey": "availableSendingReasons",
          "inputMethod": "SelectOne"
        },
        "selectedTopupAmount": {
          "typeRef": "#/domains/Remittance/types/String",
          "sourceOutputKey": "availableTopupAmounts",
          "inputMethod": "SelectOne"
        },
        "selectedDeliveryMethod": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "selectedDeliveryLocation": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "selectedSecurityQuestion": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "securityAnswer": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "smsCode": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "proofOfId": {
          "typeRef": "#/domains/Generic/types/File"
        },
        "selectedOccupation": {
          "typeRef": "#/domains/Remittance/types/String"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        }
      },
      "outputs": {
        "availablePaymentMethods": {
          "typeRef": "#/domains/Remittance/types/PaymentMethods",
          "description": "List of payment methods found on the supplier's website."
        },
        "availableAccountTypes": {
          "typeRef": "#/domains/Remittance/types/AccountTypes",
          "description": "List of account types found on the supplier's website."
        },
        "availableSendingReasons": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "availableTopupAmounts": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "availableDeliveryMethods": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "availableDeliveryLocations": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "availableSecurityQuestions": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "availableOccupations": {
          "typeRef": "#/domains/Remittance/types/Strings"
        },
        "confirmation": {
          "typeRef": "#/domains/Remittance/types/Confirmation"
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            },
            "transferType": {
              "type": "string",
              "example": "Bank Transfer"
            }
          },
          "required": [
            "email",
            "isExisting"
          ],
          "additionalProperties": false
        },
        "AccountConfirmation": {
          "type": "object",
          "properties": {
            "code": {
              "type": "string"
            }
          },
          "required": [
            "code"
          ],
          "additionalProperties": false
        },
        "Sender": {
          "type": "object",
          "properties": {
            "person": {
              "$ref": "#/domains/Remittance/types/Person"
            },
            "amount": {
              "$ref": "#/domains/Generic/types/Price"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "person",
            "amount",
            "address"
          ],
          "additionalProperties": false
        },
        "Recipient": {
          "type": "object",
          "properties": {
            "person": {
              "$ref": "#/domains/Remittance/types/Person"
            },
            "phone": {
              "$ref": "#/domains/Generic/types/Phone"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            },
            "bankAccount": {
              "oneOf": [
                {
                  "$ref": "#/domains/Remittance/types/BankAccountSWIFT"
                },
                {
                  "$ref": "#/domains/Remittance/types/BankAccountClabe"
                },
                {
                  "$ref": "#/domains/Remittance/types/BankAccountNameNumber"
                },
                {
                  "$ref": "#/domains/Remittance/types/BankAccountRoutingAccount"
                }
              ]
            }
          },
          "required": [
            "person",
            "phone",
            "address",
            "bankAccount"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Customer's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "nationality": {
              "type": "string",
              "example": "Argentina"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "DirectDebit": {
          "type": "object",
          "description": "Account details for direct debit.",
          "pii": true,
          "properties": {
            "accountNumber": {
              "type": "string",
              "minLength": 1,
              "example": "3850237499"
            },
            "routingNumber": {
              "type": "string",
              "minLength": 1,
              "example": "322271721"
            },
            "bankAccountType": {
              "type": "string",
              "minLength": 1,
              "example": "Checking"
            },
            "bankName": {
              "type": "string",
              "minLength": 1,
              "example": "Bank of America"
            },
            "accountHolder": {
              "type": "string",
              "minLength": 1,
              "example": "John Doe"
            }
          },
          "required": [
            "accountNumber",
            "routingNumber",
            "bankAccountType",
            "accountHolder"
          ],
          "additionalProperties": false
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details.",
          "pii": true,
          "properties": {
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            }
          },
          "required": [
            "card"
          ],
          "additionalProperties": false
        },
        "PaymentMethods": {
          "type": "array",
          "items": {
            "$ref": "#/domains/Remittance/types/PaymentMethod"
          }
        },
        "PaymentMethod": {
          "type": "string",
          "enum": [
            "card-credit",
            "card-debit",
            "paypal",
            "direct-debit",
            "bank-transfer",
            "no-prepayment"
          ]
        },
        "AccountTypes": {
          "type": "array",
          "items": {
            "$ref": "#/domains/Remittance/types/AccountType"
          }
        },
        "AccountType": {
          "type": "string"
        },
        "BankAccountClabe": {
          "type": "object",
          "description": "Account details for direct debit Mexico.",
          "pii": true,
          "properties": {
            "countryCode": {
              "type": "string",
              "enum": [
                "mx"
              ]
            },
            "CLABE": {
              "type": "string",
              "minLength": 1,
              "description": "Recipient's account number specific to Mexico"
            }
          },
          "required": [
            "countryCode",
            "CLABE"
          ],
          "additionalProperties": false
        },
        "BankAccountNameNumber": {
          "type": "object",
          "description": "Account details for direct debit USA.",
          "pii": true,
          "properties": {
            "countryCode": {
              "type": "string",
              "enum": [
                "do",
                "gt",
                "hn",
                "sv"
              ]
            },
            "bankName": {
              "type": "string",
              "minLength": 1,
              "example": "Banco Agricola"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 1,
              "example": "10548568"
            }
          },
          "required": [
            "countryCode",
            "bankName",
            "accountNumber"
          ],
          "additionalProperties": false
        },
        "BankAccountSWIFT": {
          "type": "object",
          "description": "Account details for direct debit USA.",
          "pii": true,
          "properties": {
            "countryCode": {
              "type": "string",
              "enum": [
                "sv"
              ]
            },
            "swiftCode": {
              "type": "string",
              "minLength": 1,
              "example": "111000025"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 1,
              "example": "10548568"
            }
          },
          "required": [
            "countryCode",
            "swiftCode",
            "accountNumber"
          ],
          "additionalProperties": false
        },
        "BankAccountRoutingAccount": {
          "type": "object",
          "description": "Account details for direct debit USA.",
          "pii": true,
          "properties": {
            "countryCode": {
              "type": "string",
              "enum": [
                "us"
              ]
            },
            "routingNumber": {
              "type": "string",
              "minLength": 1,
              "example": "111000025"
            },
            "accountNumber": {
              "type": "string",
              "minLength": 1,
              "example": "10548568"
            }
          },
          "required": [
            "countryCode",
            "routingNumber",
            "accountNumber"
          ],
          "additionalProperties": false
        },
        "Confirmation": {
          "type": "object",
          "description": "Information gathered on success page.",
          "properties": {
            "reference": {
              "type": "string",
              "description": "Confirmation reference grabbed from the page.",
              "example": "215664558"
            },
            "message": {
              "type": "string",
              "description": "Message about successful transfer.",
              "example": "Your transfer was successful."
            }
          },
          "additionalProperties": false,
          "required": [
            "reference"
          ]
        },
        "AvailableDeliveryMethods": {
          "type": "array",
          "items": {
            "$ref": "#/domains/Remittance/types/DeliveryMethod"
          }
        },
        "DeliveryMethod": {
          "type": "string"
        },
        "Strings": {
          "type": "array",
          "items": {
            "$ref": "#/domains/Remittance/types/String"
          }
        },
        "String": {
          "type": "string"
        }
      },
      "errors": [
        {
          "code": "ContactUsToContinue",
          "category": "client",
          "description": "The user being asked to contact the supplier to continue the purchase."
        },
        {
          "code": "BankDetailsInvalid",
          "category": "client",
          "description": "Bank details invalid."
        },
        {
          "code": "DirectDebitRejected",
          "category": "client",
          "description": "Direct debit details rejected."
        }
      ]
    },
    "ReservationEdit": {
      "description": "Allows automating hotel booking information edit.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/ReservationEdit/types/Account",
          "description": "If required, used for logging in."
        },
        "bookingReference": {
          "typeRef": "#/domains/ReservationEdit/types/PiiString",
          "description": "Hotel booking reference code."
        },
        "mainGuestChanges": {
          "typeRef": "#/domains/ReservationEdit/types/MainGuest",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/person",
            "/contact/email"
          ]
        },
        "bookingDetailsChanges": {
          "typeRef": "#/domains/ReservationEdit/types/BookingDetails",
          "description": "Details about hotel booking."
        },
        "guestsChanges": {
          "typeRef": "#/domains/ReservationEdit/types/Guests",
          "description": "Personal details about the guests."
        },
        "loginConfirmationCode": {
          "typeRef": "#/domains/ReservationLookup/types/PiiString",
          "description": "2F authentication code for login."
        }
      },
      "outputs": {},
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Property": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "Apartrooms Hotel"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "BookingDetails": {
          "type": "object",
          "pii": true,
          "properties": {
            "guestStatus": {
              "type": "string",
              "example": "Confirmed"
            },
            "guestName": {
              "type": "string",
              "example": "Mark Doe"
            },
            "roomStatus": {
              "type": "string",
              "example": "Cancelled by guest"
            },
            "room": {
              "oneOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ]
            },
            "roomNumber": {
              "type": "string",
              "example": "582765"
            },
            "roomType": {
              "type": "string",
              "example": "Studio"
            },
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkInTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkOutTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkInText": {
              "type": "string",
              "description": "Optional comment made by the hotel regarding the check-in status."
            },
            "guestsCount": {
              "$ref": "#/domains/ReservationEdit/types/GuestsCount"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/ReservationEdit/types/Person"
            },
            "address": {
              "$ref": "#/domains/ReservationEdit/types/Address"
            },
            "contact": {
              "$ref": "#/domains/ReservationEdit/types/GuestContact"
            },
            "document": {
              "$ref": "#/domains/ReservationEdit/types/IdentityDocument"
            },
            "company": {
              "type": "string"
            },
            "remarks": {
              "type": "string",
              "description": "Notes left by the guest.",
              "example": "Espresso & omelet."
            }
          },
          "required": [
            "person"
          ],
          "additionalProperties": false
        },
        "Guests": {
          "type": "array",
          "description": "A list of guests.",
          "minItems": 0,
          "pii": true,
          "items": {
            "$ref": "#/domains/ReservationEdit/types/Guest"
          }
        },
        "Guest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/ReservationEdit/types/Person"
            },
            "address": {
              "$ref": "#/domains/ReservationEdit/types/Address"
            },
            "contact": {
              "$ref": "#/domains/ReservationEdit/types/GuestContact"
            },
            "document": {
              "$ref": "#/domains/ReservationEdit/types/IdentityDocument"
            },
            "company": {
              "type": "string"
            }
          },
          "required": [
            "person"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs",
                "N/A"
              ]
            },
            "firstName": {
              "type": "string",
              "minLength": 1,
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "minLength": 1,
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Guest's date of birth in YYYY-MM-DD format.",
              "example": "1976-01-27"
            },
            "ageType": {
              "type": "string",
              "description": "Age type of guests.",
              "example": "Adult",
              "enum": [
                "adult",
                "child",
                "infant"
              ]
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "mobileNumber": {
              "type": "string"
            },
            "email": {
              "oneOf": [
                {
                  "type": "string",
                  "format": "email",
                  "description": "Email address used for contact.",
                  "example": "client@example.com"
                },
                {
                  "type": "string",
                  "enum": [
                    "N/A"
                  ]
                }
              ]
            }
          },
          "required": [
            "mobileNumber"
          ],
          "additionalProperties": false
        },
        "GuestsCount": {
          "type": "object",
          "properties": {
            "adults": {
              "type": "integer"
            },
            "children": {
              "type": "integer"
            },
            "infants": {
              "type": "integer"
            }
          },
          "required": [
            "adults",
            "children",
            "infants"
          ],
          "additionalProperties": false
        },
        "Address": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "streetName": {
              "type": "string",
              "description": "Name of the street.",
              "example": "Clerkenwell Close"
            },
            "streetNumber": {
              "type": "string",
              "description": "Number of the street or other building identifier, such as house number or house name",
              "example": "27-31"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "country": {
              "type": "string",
              "description": "Name of the country"
            },
            "countrySubdivision": {
              "type": "string",
              "description": "Full name of country subdivision (e.g. state, region, county, etc.), except for US states which require 2 letter code. Lowercased."
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "guestIDType": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id",
                "drivers-licence",
                "N/A"
              ]
            },
            "guestIDNumber": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "guestIDType",
            "guestIDNumber"
          ],
          "additionalProperties": false
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        },
        {
          "code": "ContactDetailsInvalid",
          "category": "client",
          "description": "Invalid contact details."
        }
      ]
    },
    "ReservationList": {
      "description": "Allows automating hotel reservation list retrieval.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/ReservationList/types/Account",
          "description": "If required, used for logging in."
        },
        "bookingReference": {
          "typeRef": "#/domains/ReservationList/types/PiiString",
          "description": "Hotel booking reference code."
        },
        "loginConfirmationCode": {
          "typeRef": "#/domains/ReservationLookup/types/PiiString",
          "description": "2F authentication code for login."
        }
      },
      "outputs": {
        "bookingsUrl": {
          "typeRef": "#/domains/ReservationList/types/Bookings",
          "description": "Upload a list of domain bookings."
        }
      },
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Bookings": {
          "type": "object",
          "properties": {
            "url": {
              "$ref": "#/domains/Generic/types/URL"
            },
            "path": {
              "type": "string",
              "description": "Website entry point. Should be a deep link to either package selection page, or to payment page.",
              "example": "/7c73814e-70af-40b0-bbac-2f7da6502354.csv"
            },
            "filename": {
              "type": "string",
              "example": "Bookings.csv"
            },
            "contentType": {
              "type": "string",
              "example": "text/csv"
            },
            "size": {
              "type": "integer",
              "example": "108375"
            }
          },
          "required": [
            "url",
            "filename",
            "path",
            "contentType",
            "size"
          ],
          "additionalProperties": false
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        },
        {
          "code": "ContactDetailsInvalid",
          "category": "client",
          "description": "Invalid contact details."
        }
      ]
    },
    "ReservationLookup": {
      "description": "Allows automating hotel booking details retrieval.",
      "private": false,
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "account": {
          "typeRef": "#/domains/ReservationLookup/types/Account",
          "description": "If required, used for logging in."
        },
        "bookingReference": {
          "typeRef": "#/domains/ReservationLookup/types/PiiString",
          "description": "Hotel booking reference code."
        },
        "loginConfirmationCode": {
          "typeRef": "#/domains/ReservationLookup/types/PiiString",
          "description": "2F authentication code for login."
        }
      },
      "outputs": {
        "mainGuest": {
          "typeRef": "#/domains/ReservationLookup/types/MainGuest",
          "description": "Personal details about the main guest."
        },
        "guests": {
          "typeRef": "#/domains/ReservationLookup/types/Guests",
          "description": "Personal details about the additional guests."
        },
        "bookingDetails": {
          "typeRef": "#/domains/ReservationLookup/types/BookingDetails",
          "description": "Details about hotel booking."
        },
        "property": {
          "typeRef": "#/domains/ReservationLookup/types/Property",
          "description": "Details about the hotel."
        }
      },
      "types": {
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/Generic/types/Person"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "Property": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "Apartrooms Hotel"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "BookingDetails": {
          "type": "object",
          "pii": true,
          "properties": {
            "guestStatus": {
              "type": "string",
              "example": "Confirmed"
            },
            "guestName": {
              "type": "string",
              "example": "Mark Doe"
            },
            "roomStatus": {
              "type": "string",
              "example": "Cancelled by guest"
            },
            "room": {
              "oneOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ]
            },
            "roomNumber": {
              "type": "string",
              "example": "582765"
            },
            "roomType": {
              "type": "string",
              "example": "Studio"
            },
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkInTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkOutTime": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "example": "18:00"
            },
            "checkInText": {
              "type": "string",
              "description": "Optional comment made by the hotel regarding the check-in status."
            },
            "guestsCount": {
              "$ref": "#/domains/ReservationLookup/types/GuestsCount"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/ReservationLookup/types/Person"
            },
            "address": {
              "$ref": "#/domains/ReservationLookup/types/Address"
            },
            "contact": {
              "$ref": "#/domains/ReservationLookup/types/GuestContact"
            },
            "document": {
              "$ref": "#/domains/ReservationLookup/types/IdentityDocument"
            },
            "company": {
              "type": "string"
            },
            "remarks": {
              "type": "string",
              "description": "Notes left by the guest.",
              "example": "Espresso & omelet."
            }
          },
          "required": [
            "person"
          ],
          "additionalProperties": false
        },
        "Guests": {
          "type": "array",
          "description": "A list of guests.",
          "minItems": 0,
          "pii": true,
          "items": {
            "$ref": "#/domains/ReservationLookup/types/Guest"
          }
        },
        "Guest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/ReservationLookup/types/Person"
            },
            "address": {
              "$ref": "#/domains/ReservationLookup/types/Address"
            },
            "contact": {
              "$ref": "#/domains/ReservationLookup/types/GuestContact"
            },
            "document": {
              "$ref": "#/domains/ReservationLookup/types/IdentityDocument"
            },
            "company": {
              "type": "string"
            }
          },
          "required": [
            "person"
          ],
          "additionalProperties": false
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs",
                "N/A"
              ]
            },
            "firstName": {
              "type": "string",
              "minLength": 1,
              "description": "First name(s) or given name(s), as specified in ID.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "minLength": 1,
              "description": "Last name or surname, as specified in ID.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Guest's date of birth in YYYY-MM-DD format.",
              "example": "1976-01-27"
            },
            "ageType": {
              "type": "string",
              "description": "Age type of guests.",
              "example": "Adult",
              "enum": [
                "adult",
                "child",
                "infant"
              ]
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "mobileNumber": {
              "type": "string"
            },
            "email": {
              "oneOf": [
                {
                  "type": "string",
                  "format": "email",
                  "description": "Email address used for contact.",
                  "example": "client@example.com"
                },
                {
                  "type": "string",
                  "enum": [
                    "N/A"
                  ]
                }
              ]
            }
          },
          "required": [
            "mobileNumber"
          ],
          "additionalProperties": false
        },
        "GuestsCount": {
          "type": "object",
          "properties": {
            "adults": {
              "type": "integer"
            },
            "children": {
              "type": "integer"
            },
            "infants": {
              "type": "integer"
            }
          },
          "required": [
            "adults",
            "children",
            "infants"
          ],
          "additionalProperties": false
        },
        "Address": {
          "type": "object",
          "description": "Physical address information, typically used as part of billing or shipping address objects.",
          "pii": true,
          "properties": {
            "line1": {
              "type": "string",
              "description": "Street name with house number.",
              "example": "501 Twin Peaks Blv"
            },
            "line2": {
              "type": "string",
              "description": "Additional address information (e.g. flat).",
              "example": "Flat 2"
            },
            "streetName": {
              "type": "string",
              "description": "Name of the street.",
              "example": "Clerkenwell Close"
            },
            "streetNumber": {
              "type": "string",
              "description": "Number of the street or other building identifier, such as house number or house name",
              "example": "27-31"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "example": "San Francisco"
            },
            "citySubdivision": {
              "type": "string",
              "description": "Name of the city subdivision.",
              "example": "Glen Park"
            },
            "postcode": {
              "type": "string",
              "description": "Postcode in country-specific format, e.g. 5-digit number in US or <code>E3 3RP</code> in UK.",
              "example": "94581"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode"
            },
            "country": {
              "type": "string",
              "description": "Name of the country"
            },
            "countrySubdivision": {
              "type": "string",
              "description": "Full name of country subdivision (e.g. state, region, county, etc.), except for US states which require 2 letter code. Lowercased."
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "guestIDType": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id",
                "drivers-licence",
                "N/A"
              ]
            },
            "guestIDNumber": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "guestIDType",
            "guestIDNumber"
          ],
          "additionalProperties": false
        },
        "PiiString": {
          "type": "string",
          "pii": true
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        },
        {
          "code": "ContactDetailsInvalid",
          "category": "client",
          "description": "Invalid contact details."
        }
      ]
    },
    "VacationRental": {
      "description": "",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point.",
          "initial": true
        },
        "guestAges": {
          "typeRef": "#/domains/Generic/types/Ages",
          "description": "Ages of all guests."
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account",
          "canonical": [
            "/email"
          ]
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "options": {
          "typeRef": "#/domains/VacationRental/types/Options",
          "default": {},
          "initial": true
        },
        "deposit": {
          "typeRef": "#/domains/VacationRental/types/Deposit",
          "sourceOutputKey": "availableDeposits",
          "inputMethod": "SelectOne"
        },
        "pets": {
          "typeRef": "#/domains/VacationRental/types/Pets"
        }
      },
      "outputs": {
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/VacationRental/types/BookingConfirmation"
        },
        "availableDeposits": {
          "typeRef": "#/domains/VacationRental/types/AvailableDeposits",
          "description": "Emitted when actual deposit information is collected.<br/>Note: on deep links with pre-selected deposits this output may not be provided."
        },
        "estimatedPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Price shown by the website prior to requiring guest information."
        },
        "estimatedDepositPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Where available, deposit price shown by the website prior to requiring guest information."
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features.",
          "properties": {
            "deposit": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "AvailableDeposits": {
          "type": "array",
          "description": "A list of available deposits found on the page.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/VacationRental/types/Deposit"
          }
        },
        "Deposit": {
          "type": "object",
          "description": "Deposit information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Deposit prompt as provided by the website.",
              "example": "Early bird deposit"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name",
            "price"
          ]
        },
        "Pets": {
          "type": "object",
          "description": "Pets information.",
          "additionalProperties": false,
          "properties": {
            "total": {
              "type": "number",
              "minimum": 0,
              "maximum": 9,
              "description": "Total count of pets for the booking, including dogs.",
              "example": 0
            },
            "dogs": {
              "type": "number",
              "minimum": 0,
              "maximum": 9,
              "description": "Total count of dogs for the booking.",
              "example": 0
            }
          },
          "required": [
            "total",
            "dogs"
          ]
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "PIN": {
              "type": "string"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        }
      },
      "errors": [
        {
          "code": "DepositNotFound",
          "category": "client",
          "description": "Given deposit option does not match one of the options we are expecting"
        },
        {
          "code": "PetOptionInvalid",
          "category": "client",
          "description": "Given pet option does not match one of the options we are expecting"
        },
        {
          "code": "PetOptionNotAvailable",
          "category": "client",
          "description": "Pet option is not available"
        },
        {
          "code": "GuestCountInvalid",
          "category": "client",
          "description": "Number of guests is not accepted by the website"
        },
        {
          "code": "GuestAgeInvalid",
          "category": "client",
          "description": "Guest age is not accepted by the website"
        },
        {
          "code": "VacationRentalNotAvailable",
          "category": "client",
          "description": "Vacation rental is not found",
          "example": "Vacation rental unavailable on given date provided"
        }
      ]
    },
    "TestHotelBooking": {
      "description": "Allows automating hotel booking on individual suppliers and OTAs.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "initial": true,
          "description": "Website entry point. Should be a deep link to either package selection page, or to payment page."
        },
        "search": {
          "typeRef": "#/domains/TestHotelBooking/types/Search"
        },
        "options": {
          "typeRef": "#/domains/TestHotelBooking/types/Options",
          "default": {},
          "initial": true,
          "description": "A set of options that define the automation's behaviour."
        },
        "selectedRooms": {
          "typeRef": "#/domains/TestHotelBooking/types/Rooms",
          "description": "List of rooms to be booked in one go. Depending on the supplier, only one item may be allowed.",
          "sourceOutputKey": "availableRooms",
          "inputMethod": "SelectMany"
        },
        "selectedHotel": {
          "typeRef": "#/domains/TestHotelBooking/types/Hotel",
          "description": "Selected hotel.",
          "sourceOutputKey": "availableHotels",
          "inputMethod": "SelectOne"
        },
        "selectedSearchRate": {
          "typeRef": "#/domains/TestHotelBooking/types/SearchRate",
          "description": "Selected search rate.",
          "sourceOutputKey": "availableSearchRates",
          "inputMethod": "SelectOne"
        },
        "guestAges": {
          "typeRef": "#/domains/Generic/types/Ages",
          "description": "List of guest ages."
        },
        "mainGuest": {
          "typeRef": "#/domains/TestHotelBooking/types/MainGuest",
          "description": "Personal details about the main guest.",
          "canonical": [
            "/person",
            "/contact/email"
          ]
        },
        "guests": {
          "typeRef": "#/domains/TestHotelBooking/types/Guests",
          "description": "Personal details about the guests."
        },
        "visit": {
          "typeRef": "#/domains/TestHotelBooking/types/Visit",
          "description": "Details about the visit."
        },
        "account": {
          "typeRef": "#/domains/Generic/types/Account",
          "description": "If required, used for logging in."
        },
        "payment": {
          "typeRef": "#/domains/TestHotelBooking/types/Payment"
        },
        "selectedPaymentMethod": {
          "typeRef": "#/domains/TestHotelBooking/types/PaymentMethod",
          "sourceOutputKey": "availablePaymentMethods",
          "inputMethod": "SelectOne"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "loginConfirmationCode": {
          "typeRef": "#/domains/TestHotelBooking/types/ConfirmationCode",
          "description": "When logging in, some websites require a confirmation code."
        }
      },
      "outputs": {
        "availableSearchRates": {
          "typeRef": "#/domains/TestHotelBooking/types/SearchRates",
          "description": "List of room rates."
        },
        "availableHotels": {
          "typeRef": "#/domains/TestHotelBooking/types/Hotels",
          "description": "List of hotels found on the supplier's website."
        },
        "availableRooms": {
          "typeRef": "#/domains/TestHotelBooking/types/Rooms",
          "description": "List of rooms found on the supplier's website."
        },
        "guestsAgeRanges": {
          "typeRef": "#/domains/TestHotelBooking/types/AgeRanges",
          "description": "Age ranges. Guest type min/max age."
        },
        "totalBookingPrice": {
          "typeRef": "#/domains/TestHotelBooking/types/TotalPrice",
          "description": "Total price of the current booking."
        },
        "availablePaymentMethods": {
          "typeRef": "#/domains/TestHotelBooking/types/PaymentMethods",
          "description": "List of payment methods found on the supplier's website."
        },
        "hotelDetails": {
          "typeRef": "#/domains/TestHotelBooking/types/HotelDetails",
          "description": "Details about the hotel."
        },
        "supportedCards": {
          "typeRef": "#/domains/TestHotelBooking/types/SupportedCards",
          "description": "List of card brands and types found on the supplier's website."
        },
        "priceBreakdown": {
          "typeRef": "#/domains/TestHotelBooking/types/PriceBreakdown",
          "description": "Total price breakdown."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/TestHotelBooking/types/BookingConfirmation"
        },
        "billingPrice": {
          "typeRef": "#/domains/Generic/types/Price"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "properties": {
            "success": {
              "type": "boolean",
              "description": "If <code>true</code>, returns a fake success without making a booking.",
              "default": false
            },
            "searchRates": {
              "type": "boolean",
              "description": "If <code>true</code>, enables special rates output and input at search.",
              "default": false
            },
            "showMemberRates": {
              "type": "boolean",
              "description": "If <code>true</code>, enables member rates output and input at room selection.",
              "default": false
            },
            "userAgent": {
              "type": "string",
              "description": "Enables custom user-agent header when performing automations."
            }
          }
        },
        "Visit": {
          "type": "object",
          "properties": {
            "purpose": {
              "type": "string",
              "enum": [
                "business",
                "leisure"
              ]
            },
            "message": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        "SupportedCards": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/CardBrandType"
          }
        },
        "ConfirmationCode": {
          "type": "string",
          "minLength": 1,
          "example": "ABC123"
        },
        "CardBrandType": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "description": "Card type, debit or credit.",
              "enum": [
                "debit",
                "credit"
              ]
            },
            "brand": {
              "type": "string",
              "description": "Card brand.",
              "enum": [
                "visa",
                "mastercard",
                "amex",
                "discover"
              ]
            }
          },
          "required": [
            "brand",
            "type"
          ],
          "additionalProperties": false
        },
        "SearchRates": {
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/SearchRate"
          }
        },
        "SearchRate": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "Senior Discounts"
            },
            "text": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Search": {
          "type": "object",
          "properties": {
            "checkInDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "checkOutDate": {
              "type": "string",
              "format": "date",
              "example": "1976-01-27"
            },
            "rooms": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/TestHotelBooking/types/SearchRoom"
              }
            },
            "text": {
              "type": "string",
              "example": "London, UK",
              "minLength": 3
            }
          },
          "required": [
            "checkInDate",
            "checkOutDate",
            "rooms"
          ],
          "additionalProperties": false
        },
        "SearchRoom": {
          "type": "object",
          "properties": {
            "ages": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "number",
                "minimum": 0,
                "maximum": 150,
                "exmaple": 31
              }
            }
          },
          "required": [
            "ages"
          ],
          "additionalProperties": false
        },
        "Hotels": {
          "type": "array",
          "description": "A list of hotels.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/Hotel"
          }
        },
        "HotelDetails": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "My Hotel"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Hotel": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1,
              "example": "My Hotel"
            },
            "priceLine": {
              "type": "string",
              "minLength": 1,
              "example": "From 188 GBP Avg./night"
            },
            "addressLine": {
              "type": "string",
              "minLength": 1,
              "example": "21 Piccadilly London, United Kingdom W1J 0BH"
            },
            "images": {
              "type": "array",
              "description": "A list of images.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            }
          },
          "required": [
            "name"
          ],
          "additionalProperties": false
        },
        "Rooms": {
          "type": "array",
          "description": "A list of rooms.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/Room"
          }
        },
        "RoomDescription": {
          "type": "array",
          "description": "A list to describe a room.",
          "minItems": 0,
          "items": {
            "type": "string",
            "example": "Maximum occupancy: 2"
          }
        },
        "Room": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "example": "Standard Single Room"
            },
            "name": {
              "type": "string",
              "example": "Room with Window"
            },
            "rate": {
              "type": "string",
              "example": "Breakfast Plus"
            },
            "description": {
              "$ref": "#/domains/TestHotelBooking/types/RoomDescription"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            },
            "strikePrice": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 30600,
                "currency": "gbp"
              }
            },
            "priceLines": {
              "type": "array",
              "items": {
                "$ref": "#/domains/TestHotelBooking/types/PriceLineItem"
              }
            },
            "cancellation": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "enum": [
                    "full-refundable",
                    "flexible-refundable",
                    "non-refundable",
                    "unknown"
                  ]
                },
                "details": {
                  "$ref": "#/domains/Generic/types/StructuredTextItem",
                  "example": {
                    "type": "Text",
                    "text": "Free cancellation up to 24h before. Cancellation not allowed afterwards."
                  }
                }
              },
              "required": [
                "code"
              ],
              "additionalProperties": false
            },
            "valueAdditions": {
              "type": "array",
              "items": {
                "$ref": "#/domains/TestHotelBooking/types/ValueAddition"
              }
            },
            "rateGroup": {
              "type": "string",
              "example": "standard"
            },
            "images": {
              "type": "array",
              "items": {
                "$ref": "#/domains/Generic/types/Link"
              }
            }
          },
          "required": [
            "type",
            "price",
            "cancellation",
            "valueAdditions"
          ],
          "additionalProperties": false
        },
        "ValueAddition": {
          "type": "string",
          "enum": [
            "pay-later",
            "free-breakfast",
            "free-half-board",
            "free-full-board",
            "free-all-inclusive",
            "free-parking",
            "free-internet"
          ]
        },
        "PriceBreakdown": {
          "type": "array",
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/PriceLineItem"
          }
        },
        "PriceLineItem": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "net-rate",
                "city-tax",
                "vat",
                "hotel-fee",
                "resort-fee",
                "service-fee",
                "booking-fee",
                "total-now",
                "total-later",
                "total-later-supplier",
                "total-overall",
                "total-overall-supplier",
                "others"
              ]
            },
            "paidAtHotel": {
              "type": "boolean"
            },
            "excludedFromTotals": {
              "type": "boolean"
            },
            "description": {
              "type": "string"
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "example": {
                "value": 20600,
                "currency": "gbp"
              }
            }
          },
          "required": [
            "type",
            "description",
            "price"
          ],
          "additionalProperties": false
        },
        "PaymentMethods": {
          "type": "array",
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/PaymentMethod"
          }
        },
        "PaymentMethod": {
          "type": "string",
          "enum": [
            "card",
            "paypal",
            "direct-debit",
            "bank-transfer",
            "no-prepayment"
          ]
        },
        "MainGuest": {
          "type": "object",
          "pii": true,
          "properties": {
            "person": {
              "$ref": "#/domains/TestHotelBooking/types/Person"
            },
            "contact": {
              "$ref": "#/domains/TestHotelBooking/types/GuestContact"
            }
          },
          "required": [
            "person",
            "contact"
          ],
          "additionalProperties": false
        },
        "GuestContact": {
          "type": "object",
          "properties": {
            "phone": {
              "$ref": "#/domains/Generic/types/AnyPhoneString"
            },
            "email": {
              "type": "string",
              "description": "Email address used for contact.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "required": [
            "phone",
            "email"
          ],
          "additionalProperties": false
        },
        "Guests": {
          "type": "array",
          "description": "A list of guests.",
          "minItems": 1,
          "pii": true,
          "items": {
            "$ref": "#/domains/TestHotelBooking/types/Person"
          }
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity. This is a copy of Generic.Person, with title and document removed.",
          "pii": true,
          "properties": {
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "AgeRanges": {
          "type": "object",
          "properties": {
            "children": {
              "$ref": "#/domains/TestHotelBooking/types/AgeRange"
            },
            "infants": {
              "$ref": "#/domains/TestHotelBooking/types/AgeRange"
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "AgeRange": {
          "type": "object",
          "properties": {
            "minAge": {
              "type": "integer"
            },
            "maxAge": {
              "type": "integer"
            }
          },
          "required": [
            "minAge",
            "maxAge"
          ],
          "additionalProperties": false
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "TotalPrice": {
          "type": "object",
          "description": "Total booking price that includes pay now and pay later",
          "properties": {
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "additionalProperties": false,
          "required": [
            "price"
          ]
        },
        "Payment": {
          "type": "object",
          "description": "Payment information, including card details and billing address.",
          "pii": true,
          "properties": {
            "card": {
              "$ref": "#/domains/Generic/types/PaymentCard"
            },
            "person": {
              "$ref": "#/domains/TestHotelBooking/types/Person"
            },
            "address": {
              "$ref": "#/domains/Generic/types/Address"
            }
          },
          "required": [
            "card",
            "person",
            "address"
          ],
          "additionalProperties": false
        }
      },
      "errors": [
        {
          "code": "RoomNotAvailable",
          "category": "client",
          "description": "The website claims the room is not available for the selected dates."
        }
      ]
    },
    "TrainBooking": {
      "description": "Automates bus and chack tickets booking on websites.",
      "private": false,
      "successCode": {
        "outputKey": "bookingConfirmation",
        "valuePath": "/bookingReference"
      },
      "inputs": {
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to one of the checkout flow pages."
        },
        "search": {
          "typeRef": "#/domains/TrainBooking/types/Search",
          "initial": true
        },
        "selectedOutboundTrip": {
          "typeRef": "#/domains/TrainBooking/types/Trip",
          "sourceOutputKey": "availableOutboundTrips",
          "inputMethod": "SelectOne"
        },
        "selectedInboundTrip": {
          "typeRef": "#/domains/TrainBooking/types/Trip",
          "sourceOutputKey": "availableInboundTrips",
          "inputMethod": "SelectOne"
        },
        "selectedOutboundJourney": {
          "typeRef": "#/domains/TrainBooking/types/Journey",
          "sourceOutputKey": "availableOutboundJourneys",
          "inputMethod": "SelectOne"
        },
        "selectedInboundJourney": {
          "typeRef": "#/domains/TrainBooking/types/Journey",
          "sourceOutputKey": "availableInboundJourneys",
          "inputMethod": "SelectOne"
        },
        "selectedOutboundFare": {
          "typeRef": "#/domains/TrainBooking/types/Fare",
          "sourceOutputKey": "availableOutboundFares",
          "inputMethod": "SelectOne"
        },
        "selectedInboundFare": {
          "typeRef": "#/domains/TrainBooking/types/Fare",
          "sourceOutputKey": "availableInboundFares",
          "inputMethod": "SelectOne"
        },
        "selectedDelivery": {
          "typeRef": "#/domains/TrainBooking/types/Delivery",
          "description": "Requested when delivery choices are required by website.<br/>At this point <code>availableDeliveries</code> output should contain information about available delivery options.<br/>Note: on deep links with pre-selected delivery options, this input might not required.<br/>Automation may fail if the incorrect option is specified, or if the delivery option is no longer available, for example, for a late or same day booking.",
          "sourceOutputKey": "availableDeliveries",
          "inputMethod": "SelectOne"
        },
        "account": {
          "typeRef": "#/domains/TrainBooking/types/Account",
          "canonical": [
            "/email"
          ]
        },
        "passengers": {
          "typeRef": "#/domains/TrainBooking/types/Passengers"
        },
        "discount": {
          "typeRef": "#/domains/TrainBooking/types/Discount"
        },
        "payment": {
          "typeRef": "#/domains/Generic/types/Payment"
        },
        "panToken": {
          "typeRef": "#/domains/Generic/types/PanToken"
        },
        "finalPriceConsent": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Client's consent for final price, should exactly match the <code>finalPrice</code> object from output.<br/>Automation will not proceed with placing order until the consent is provided.",
          "sourceOutputKey": "finalPrice",
          "inputMethod": "Consent"
        },
        "smsConfirmation": {
          "typeRef": "#/domains/TrainBooking/types/VerificationCode",
          "description": "An SMS confirmation for authorizing the payment. Occurs in some of the transactions in place of 3dsecure."
        },
        "options": {
          "typeRef": "#/domains/TrainBooking/types/Options",
          "default": {},
          "initial": true
        }
      },
      "outputs": {
        "availableOutboundTrips": {
          "typeRef": "#/domains/TrainBooking/types/Trips"
        },
        "availableInboundTrips": {
          "typeRef": "#/domains/TrainBooking/types/Trips"
        },
        "availableOutboundJourneys": {
          "typeRef": "#/domains/TrainBooking/types/Journeys"
        },
        "availableInboundJourneys": {
          "typeRef": "#/domains/TrainBooking/types/Journeys"
        },
        "availableOutboundFares": {
          "typeRef": "#/domains/TrainBooking/types/AvailableFares"
        },
        "availableInboundFares": {
          "typeRef": "#/domains/TrainBooking/types/AvailableFares"
        },
        "availableDeliveries": {
          "typeRef": "#/domains/TrainBooking/types/AvailableDeliveriesOrNull",
          "description": "Emitted when actual delivery information is collected.<br/>Note: on deep links with pre-selected delivery, this output may not be provided."
        },
        "estimatedPrice": {
          "typeRef": "#/domains/Generic/types/PriceConsent",
          "description": "Price shown by the website prior to requiring passenger information.<br/>This is likely not the final price, as flight ancilliaries may be added as requested, or additional credit card charges may be applied."
        },
        "finalPrice": {
          "description": "Emitted immediately before placing order, when final price is available.<br/>Automation will request <code>finalPriceConsent</code> input which should match this object.",
          "typeRef": "#/domains/Generic/types/PriceConsent"
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/TrainBooking/types/BookingConfirmation"
        }
      },
      "types": {
        "Search": {
          "type": "object",
          "description": "Information about the trip.",
          "properties": {
            "cabinClass": {
              "description": "Preferred cabin class, used on trip search forms.",
              "type": "string",
              "enum": [
                "second",
                "first"
              ]
            },
            "outbound": {
              "$ref": "#/domains/TrainBooking/types/TrainSearch",
              "description": "Outbound trip specification."
            },
            "inbound": {
              "$ref": "#/domains/TrainBooking/types/TrainSearch",
              "description": "Inbound (return) trip specification. If omitted, one-way trip booking flow is used."
            },
            "passengerAges": {
              "$ref": "#/domains/Generic/types/Ages",
              "description": "Ages of all passengers.",
              "example": [
                34,
                31,
                9
              ]
            }
          },
          "required": [
            "outbound",
            "passengerAges"
          ],
          "additionalProperties": false
        },
        "TrainSearch": {
          "type": "object",
          "description": "Outbound and inbound trips specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/TrainBooking/types/DateTerminal"
            },
            "destination": {
              "$ref": "#/domains/TrainBooking/types/DateTerminal"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "DateTerminal": {
          "type": "object",
          "properties": {
            "date": {
              "type": "string",
              "format": "date",
              "description": "Date of trip (terminal local date).",
              "example": "2019-01-01"
            },
            "time": {
              "type": "string",
              "pattern": "^[012][0-9]:[0-5][0-9]$",
              "description": "Selected time for availability search.",
              "example": "08:00"
            },
            "terminalLocality": {
              "type": "string",
              "description": "Terminal locality, usually city name.",
              "example": "London"
            },
            "terminalName": {
              "type": "string",
              "description": "Name of the terminal as found on the booking website.",
              "example": "London Liverpool Street"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of the terminal.",
              "example": "gb"
            }
          },
          "required": [
            "date",
            "time",
            "terminalName"
          ],
          "additionalProperties": false
        },
        "Trips": {
          "type": "array",
          "description": "An array of trips.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TrainBooking/types/Trip"
          }
        },
        "Trip": {
          "type": "object",
          "description": "Outbound and inbound specification.",
          "properties": {
            "origin": {
              "$ref": "#/domains/TrainBooking/types/DateTimeTerminal"
            },
            "destination": {
              "$ref": "#/domains/TrainBooking/types/DateTimeTerminal"
            },
            "connectionsCount": {
              "type": "integer"
            },
            "lowestPrice": {
              "type": "object",
              "description": "'Start from' price for each class.",
              "properties": {
                "secondClass": {
                  "$ref": "#/domains/Generic/types/Price"
                },
                "firstClass": {
                  "$ref": "#/domains/Generic/types/Price"
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "Journeys": {
          "type": "array",
          "description": "An array of journeys.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TrainBooking/types/Journey"
          }
        },
        "Journey": {
          "type": "object",
          "description": "Outbound and inbound specification.",
          "properties": {
            "segments": {
              "type": "array",
              "description": "List of change stations names.",
              "items": {
                "$ref": "#/domains/TrainBooking/types/Segment"
              }
            },
            "origin": {
              "$ref": "#/domains/TrainBooking/types/DateTimeTerminal"
            },
            "destination": {
              "$ref": "#/domains/TrainBooking/types/DateTimeTerminal"
            },
            "connectionsCount": {
              "type": "integer"
            },
            "fares": {
              "$ref": "#/domains/TrainBooking/types/JourneyFares"
            }
          },
          "required": [
            "origin",
            "destination"
          ],
          "additionalProperties": false
        },
        "JourneyFares": {
          "type": "array",
          "description": "A list of available journey fares found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TrainBooking/types/Fare"
          }
        },
        "JourneyFare": {
          "type": "object",
          "description": "Train fare information.",
          "additionalProperties": false,
          "properties": {
            "fareName": {
              "type": "string"
            },
            "className": {
              "type": "string"
            },
            "cabinClass": {
              "$ref": "#/domains/TrainBooking/types/CabinClass"
            },
            "cancellation": {
              "type": "string",
              "description": "Fare cancellation type.",
              "example": "rebookable",
              "enum": [
                "rebookable",
                "non-rebookable",
                "refundable",
                "unknown"
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "cabinClass",
            "cancellation",
            "price"
          ]
        },
        "AvailableFares": {
          "type": "array",
          "description": "A list of available fares found on the website.",
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TrainBooking/types/Fare"
          }
        },
        "Fare": {
          "type": "object",
          "description": "Train fare information.",
          "additionalProperties": false,
          "properties": {
            "segments": {
              "type": "array",
              "description": "List of change stations names.",
              "items": {
                "$ref": "#/domains/TrainBooking/types/Segment"
              }
            },
            "fareName": {
              "type": "string"
            },
            "className": {
              "type": "string"
            },
            "cabinClass": {
              "$ref": "#/domains/TrainBooking/types/CabinClass"
            },
            "cancellation": {
              "type": "string",
              "description": "Fare cancellation type.",
              "example": "rebookable",
              "enum": [
                "rebookable",
                "non-rebookable",
                "refundable",
                "unknown"
              ]
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "cabinClass",
            "cancellation",
            "price"
          ]
        },
        "Segment": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "origin": {
              "$ref": "#/domains/TrainBooking/types/Itinerary"
            },
            "destination": {
              "$ref": "#/domains/TrainBooking/types/Itinerary"
            }
          },
          "required": [
            "origin",
            "destination"
          ]
        },
        "Transport": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "number": {
              "type": "string",
              "description": "Reference number of the transportation vehicle.",
              "example": "AW 1675"
            },
            "method": {
              "type": "string",
              "description": "Type of transportation (ie train, bus).",
              "enum": [
                "train",
                "bus",
                "tram",
                "metro",
                "taxi",
                "walking",
                "ferry"
              ]
            }
          },
          "required": [
            "number"
          ]
        },
        "Itinerary": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "terminalName": {
              "type": "string",
              "description": "Name of the terminal as found on the booking website.",
              "example": "London Liverpool Street"
            },
            "dateTime": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "description": "Date and time (terminal local time).",
              "example": "2018-02-02 19:40"
            },
            "transport": {
              "$ref": "#/domains/TrainBooking/types/Transport"
            }
          },
          "required": [
            "terminalName"
          ]
        },
        "CabinClass": {
          "type": "string",
          "enum": [
            "second-class",
            "first-class",
            "sleeping-car"
          ]
        },
        "DateTimeTerminal": {
          "type": "object",
          "properties": {
            "dateTime": {
              "type": "string",
              "pattern": "^20[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-3][0-9]) [012][0-9]:[0-5][0-9]$",
              "description": "Date and time (terminal local time).",
              "example": "2018-02-02 19:40"
            },
            "terminalLocality": {
              "type": "string",
              "description": "Terminal locality, usually city name.",
              "example": "London"
            },
            "terminalName": {
              "type": "string",
              "description": "Name of the terminal as found on the booking website.",
              "example": "London Liverpool Street"
            },
            "countryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Country code of the terminal.",
              "example": "gb"
            }
          },
          "required": [
            "dateTime",
            "terminalName"
          ],
          "additionalProperties": false
        },
        "Passengers": {
          "type": "array",
          "description": "An array with details for each passenger.",
          "pii": true,
          "minItems": 1,
          "items": {
            "$ref": "#/domains/TrainBooking/types/Passenger"
          }
        },
        "Passenger": {
          "type": "object",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in passport or travel document.",
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "description": "Passenger's date of birth in YYYY-MM-DD format.",
              "format": "date",
              "example": "1976-01-27"
            },
            "loyaltyNumber": {
              "type": "string"
            },
            "addAdditionalLuggage": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3,
              "default": 0
            },
            "document": {
              "$ref": "#/domains/TrainBooking/types/PassengerDocument"
            }
          },
          "required": [
            "firstName",
            "lastName",
            "dateOfBirth"
          ],
          "additionalProperties": false
        },
        "Account": {
          "type": "object",
          "description": "Account information for filling in contact details.<br/>Receipts and booking references will typically be sent to specified <code>email</code>.<br/>Some websites also require registering user account, in which case <code>password</code> must be provided.",
          "pii": true,
          "properties": {
            "email": {
              "type": "string",
              "description": "Account email, typically used for user sign up / sign in.<br/>Note: most websites will send receipt and/or confirmation emails when order is placed successfully. Use contactEmail when different.<br/>Automation may result in registering new user account with this email address, and may fail if account with specified email already exists. We recommend you <a href=\"https://docs.automationcloud.net/v2.0/docs/email-proxy\" target=\"_blank\" rel=\"noopener\">use an email proxy to mitigate this issue</a>.",
              "format": "email",
              "example": "hello@example.com"
            },
            "contactEmail": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            },
            "password": {
              "type": "string",
              "description": "May be omitted if particular website does not require user sign in / sign up. Automation may fail if password is required on a particular website but not provided. One strategy could be to always generate random passwords to create one-time account.",
              "default": ""
            },
            "phone": {
              "description": "Account phone number, may also be used as contact details.",
              "$ref": "#/domains/Generic/types/Phone"
            },
            "isExisting": {
              "description": "If value is <code>true</code> automation will try to use account details to perform sign in instead of sign up. Automation will fail if incorrect account details are specified.",
              "type": "boolean"
            },
            "username": {
              "type": "string",
              "example": "john012345"
            },
            "person": {
              "description": "When an account needs to be created for a person (first name, last name, etc), this key will be used.",
              "$ref": "#/domains/TrainBooking/types/Person"
            }
          },
          "required": [
            "email",
            "isExisting"
          ],
          "additionalProperties": false
        },
        "Discount": {
          "type": "string",
          "minLength": 1,
          "pii": true
        },
        "Person": {
          "type": "object",
          "description": "Basic information about person's identity.",
          "pii": true,
          "properties": {
            "title": {
              "type": "string",
              "description": "",
              "enum": [
                "mr",
                "miss",
                "ms",
                "mrs"
              ]
            },
            "firstName": {
              "type": "string",
              "description": "First name(s) or given name(s), as specified in ID.",
              "minLength": 1,
              "example": "Bob"
            },
            "middleName": {
              "type": "string",
              "default": "",
              "description": "Middle name, if applicable.<br/>This will only be used on websites which provide separate entry for middle names, otherwise it will be ignored.<br/>If middle name is essential for placing order, consider appending it to <code>firstName</code>."
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in ID.",
              "minLength": 1,
              "example": "Smith"
            },
            "dateOfBirth": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "document": {
              "$ref": "#/domains/TrainBooking/types/IdentityDocument"
            }
          },
          "required": [
            "title",
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "IdentityDocument": {
          "type": "object",
          "description": "Person ID (passport or other document). Automation may fail if this information is required by the website, but not provided.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "city": {
              "type": "string",
              "description": "Name of city, town or other settlement.",
              "minLength": 1,
              "example": "New York"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number",
            "expirationDate",
            "issueCountryCode"
          ],
          "additionalProperties": false
        },
        "AvailableDeliveriesOrNull": {
          "oneOf": [
            {
              "type": "array",
              "description": "A list of available delivery options found on the page.",
              "minItems": 1,
              "items": {
                "$ref": "#/domains/TrainBooking/types/Delivery"
              }
            },
            {
              "type": "null"
            }
          ]
        },
        "Delivery": {
          "type": "object",
          "description": "Ticket delivery information.",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string",
              "description": "Delivery text as displayed by the provider."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price"
            }
          },
          "required": [
            "name"
          ]
        },
        "PassengerDocument": {
          "type": "object",
          "description": "Passenger ID (passport or other travel document). Automation may fail if this information is required by website, but not provided by Client.",
          "pii": true,
          "properties": {
            "type": {
              "type": "string",
              "description": "Document type.",
              "enum": [
                "passport",
                "national-id"
              ]
            },
            "number": {
              "type": "string",
              "description": "Document number.",
              "example": "75 127001"
            },
            "issueDate": {
              "type": "string",
              "format": "date",
              "example": "2008-01-01"
            },
            "expirationDate": {
              "type": "string",
              "format": "date",
              "example": "2028-01-01"
            },
            "issueCountryCode": {
              "$ref": "#/domains/Generic/types/CountryCode",
              "description": "Code of country where the document was issued."
            }
          },
          "required": [
            "type",
            "number",
            "expirationDate",
            "issueCountryCode"
          ],
          "additionalProperties": false
        },
        "VerificationCode": {
          "type": "object",
          "description": "Verification code",
          "properties": {
            "code": {
              "type": "string",
              "example": "1234"
            }
          },
          "required": [
            "code"
          ]
        },
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features such as upsells and additional features. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {
            "priceCheck": {
              "type": "boolean",
              "default": false
            }
          }
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference grabbed from the page.",
              "example": "RL2XYZ"
            },
            "message": {
              "type": "string",
              "description": "Message about successful booking.",
              "example": "Your booking was successful."
            },
            "price": {
              "$ref": "#/domains/Generic/types/Price",
              "description": "Price, if found on the successful booking page."
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        }
      },
      "errors": [
        {
          "code": "TripInvalid",
          "category": "client",
          "description": "Trip details are invalid."
        },
        {
          "code": "OutboundTripNotAvailable",
          "category": "client",
          "description": "Outbound trip dates/times are not available, either sold out or not found."
        },
        {
          "code": "InboundTripNotAvailable",
          "category": "client",
          "description": "Inbound trip dates/times are not available, either sold out or not found."
        },
        {
          "code": "OutboundFareNotFound",
          "category": "client",
          "description": "Given outbound fare does not match one of the options we are expecting."
        },
        {
          "code": "LoadingFailed",
          "category": "client",
          "description": "A website issue in which the page gets stuck in infinite loading."
        },
        {
          "code": "NoJourneysAvailable",
          "category": "client",
          "description": "When the search returns no results."
        },
        {
          "code": "InboundFareNotFound",
          "category": "client",
          "description": "Given inbound fare does not match one of the options we are expecting."
        },
        {
          "code": "ExtraLuggageNotAvailable",
          "category": "client",
          "description": "The website does not allow adding additional luggage."
        },
        {
          "code": "ExtraLuggageLimitExceeded",
          "category": "client",
          "description": "The website does not allow adding the amount of additional luggage specified in the input."
        },
        {
          "code": "PassengerDetailsInvalid",
          "category": "client",
          "description": "The website invalidates some of the passenger details."
        },
        {
          "code": "DocumentDetailsInvalid",
          "category": "client",
          "description": "The website invalidates the document details."
        },
        {
          "code": "LoyaltyNumberInvalid",
          "category": "client",
          "description": "The promo code supplied is invalid."
        },
        {
          "code": "SeatsNotAvailable",
          "category": "client",
          "description": "The website claims that either no seats are available, or the selected seats are not available."
        }
      ]
    },
    "TravelTicketRetrieval": {
      "description": "Allows automating tickets retrieval for means of travel on websites.",
      "private": false,
      "inputs": {
        "options": {
          "typeRef": "#/domains/TravelTicketRetrieval/types/Options",
          "default": {},
          "initial": true
        },
        "url": {
          "typeRef": "#/domains/Generic/types/URL",
          "description": "Website entry point. Should be a deep link to either flight page or flight selection page.",
          "initial": true
        },
        "bookingConfirmation": {
          "typeRef": "#/domains/TravelTicketRetrieval/types/BookingConfirmation"
        }
      },
      "outputs": {
        "bookedTickets": {
          "typeRef": "#/domains/TravelTicketRetrieval/types/BookedTickets"
        }
      },
      "types": {
        "Options": {
          "type": "object",
          "description": "Flags for enabling optional automation features like seat selection. Clients should send <code>false</code> or omit flags if specific features are not implemented on their end.",
          "properties": {}
        },
        "BookingConfirmation": {
          "type": "object",
          "description": "Information gathered on \"Booking success\" page.",
          "properties": {
            "bookingReference": {
              "type": "string",
              "description": "Booking reference.",
              "example": "RL2XYZ"
            },
            "code": {
              "type": "string",
              "description": "Code required to amend a booking.",
              "example": "1411"
            },
            "lastName": {
              "type": "string",
              "description": "Last name or surname, as specified in passport or travel document.",
              "example": "Smith"
            },
            "email": {
              "type": "string",
              "description": "Contact email. When this property is not set but required by the target website, account.email is used instead.",
              "format": "email",
              "example": "client@example.com"
            }
          },
          "additionalProperties": false,
          "required": [
            "bookingReference"
          ]
        },
        "BookedTickets": {
          "type": "array",
          "description": "A list of available tickets found on the website.",
          "minItems": 1,
          "maxItems": 9,
          "items": {
            "$ref": "#/domains/Generic/types/File"
          }
        }
      },
      "errors": [
        {
          "code": "BookingNotFound",
          "category": "client",
          "description": "Booking not found, usually caused by wrong booking reference or name."
        },
        {
          "code": "BookingNotAvailable",
          "category": "client",
          "description": "Booking is blocked, usually caused by trying to access it after short periods of time."
        }
      ]
    }
  }
}