{
  "type": "object",
  "$schema": "http://json-schema.org/draft-03/schema",
  "id": "http://jsonschema.net",
  "required": true,
  "additionalProperties": false,
  "properties": {
    "repeat": {
      "type": "boolean",
      "required": false
    },
    "acquirer_id": {
      "type": "string",
      "required": true
    },
    "message_class": {
      "type": "string",
      "required": false
    },
    "requested_workflow": {
      "type": "string",
      "required": false
    },
    "merchant": {
      "type": "object",
      "required": true,
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "required": true,
          "minLength": 1,
          "maxLength": 32,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "terminal_id": {
          "type": "string",
          "required": false,
          "minLength": 1,
          "maxLength": 8,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "ppid": {
          "type": "string",
          "required": false,
          "minLength": 1,
          "maxLength": 20,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "name": {
          "type": "string",
          "required": true,
          "minLength": 1,
          "maxLength": 40,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "return_url": {
          "type": "string",
          "required": false,
          "format": "uri",
          "minLength": 1,
          "maxLength": 255
        },
        "logo": {
          "type": "string",
          "required": false
        }
      }
    },
    "account": {
      "type": "object",
      "required": false,
      "additionalProperties": true,
      "properties": {
        "full_name": {
          "type": "string",
          "required": true,
          "minLength": 2,
          "maxLength": 128
        },
        "identifier_type": {
          "type": "string",
          "required": true,
          "maxLength": 32
        },
        "identifier": {
          "type": "string",
          "required": true,
          "maxLength": 128
        },
        "secret": {
          "type": "string",
          "required": true,
          "maxLength": 64
        },
        "card_token": {
          "type": "string",
          "required": false,
          "minLength": 1,
          "maxLength": 32,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        }
      }
    },
    "cardholder": {
      "type": "object",
      "required": false,
      "additionalProperties": false,
      "properties": {
        "pan": {
          "type": "string",
          "required": true,
          "minLength": 12,
          "maxLength": 19,
          "pattern": "[0-9]+"
        },
        "expiration_date": {
          "type": "string",
          "required": true,
          "minLength": 4,
          "maxLength": 4,
          "pattern": "[0-9]+"
        },
        "cvv": {
          "type": "string",
          "required": false,
          "minLength": 3,
          "maxLength": 4,
          "pattern": "[0-9]+"
        },
        "name": {
          "type": "string",
          "required": true,
          "maxLength": 255,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        }
      }
    },
    "transaction": {
      "type": "object",
      "required": true,
      "additionalProperties": false,
      "properties": {
        "id": {
          "type": "string",
          "required": true,
          "minLength": 1,
          "maxLength": 40,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "datetime": {
          "type": "string",
          "required": true,
          "format": "date-time"
        },
        "amount": {
          "type": "string",
          "required": true,
          "pattern": "[0-9\\.]+",
          "minLength": 1,
          "maxLength": 20
        },
        "currency": {
          "type": "string",
          "required": true,
          "minLength": 3,
          "maxLength": 3,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "reference": {
          "type": "string",
          "required": true,
          "minLength": 0,
          "maxLength": 100,
          "pattern": "^[0-9a-zA-Z\\. \\+\\?\\!\\$\\:\\'\\\"\\#\\-\\,\\%\\@\\_\\=\\*]+$"
        },
        "description": {
          "type": "string",
          "required": false,
          "maxLength": 128
        }
      }
    },
    "client": {
      "type": "object",
      "required": false,
      "additionalProperties": false,
      "properties": {
        "ip": {
          "type": "string",
          "required": false,
          "format": "ipv4"
        },
        "name": {
          "type": "string",
          "minLength": 0,
          "maxLength": 255
        },
        "dob": {
          "type": "string",
          "required": false,
          "format": "date"
        },
        "citizen_country": {
          "type": "string",
          "required": false,
          "pattern": "[a-zA-Z]{2}"
        },
        "birth_country": {
          "type": "string",
          "required": false,
          "pattern": "[a-zA-Z]{2}"
        },
        "resident_country": {
          "type": "string",
          "required": false,
          "pattern": "[a-zA-Z]{2}"
        },
        "email": {
          "type": "string",
          "required": false,
          "format": "email"
        },
        "address": {
          "type": "string",
          "required": false,
          "maxLength": 255
        },
        "mobile_phone": {
          "type": "string",
          "required": false,
          "maxLength": 255
        }
      }
    },
    "http_auth_type": {
      "type": "string",
      "required": false
    },
    "http_auth_value": {
      "type": "string",
      "required": false
    },
    "upstream_auth_type": {
      "type": "string",
      "required": false
    },
    "upstream_auth_value": {
      "type": "string",
      "required": false
    },
    "downstream_auth_type": {
      "type": "string",
      "required": false
    },
    "downstream_auth_value": {
      "type": "string",
      "required": false
    }
  }
}