{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Cart and Checkout Document Object Schema",
    "description": "Document object schema for cart, checkout, and customer information, to be used for conditional visibility, requirement, and validation of fields.",
    "type": "object",
    "properties": {
        "cart": {
            "type": "object",
            "description": "Information about the shopping cart",
            "properties": {
                "coupons": {
                    "type": "array",
                    "description": "List of coupon codes applied to the cart",
                    "items": {
                        "type": "string"
                    }
                },
                "shipping_rates": {
                    "type": "array",
                    "description": "List of currently selected shipping rates",
                    "items": {
                        "type": "string",
                        "description": "Shipping rate identifier using the full shipping rate ID so method_id:instance_id, for example: flat_rate:1"
                    }
                },
                "items": {
                    "type": "array",
                    "description": "List of product IDs in the cart, IDs will be duplicated depending on the quantity of the product in the cart, so if you have 2 of product ID 1, the array will have 2 entries of product ID 1",
                    "items": {
                        "type": "integer"
                    }
                },
                "items_type": {
                    "type": "array",
                    "description": "Types of items in the cart, for example: simple, variation, subscription, etc.",
                    "items": {
                        "type": "string"
                    }
                },
                "items_count": {
                    "type": "integer",
                    "description": "Total number of items in the cart",
                    "minimum": 0
                },
                "items_weight": {
                    "type": "number",
                    "description": "Total weight of items in the cart",
                    "minimum": 0
                },
                "needs_shipping": {
                    "type": "boolean",
                    "description": "Whether the items in the cart require shipping"
                },
                "prefers_collection": {
                    "type": "boolean",
                    "description": "Whether the customer prefers using Local Pickup"
                },
                "totals": {
                    "type": "object",
                    "description": "Cart totals information",
                    "properties": {
                        "total_price": {
                            "type": "integer",
                            "description": "Total price of the cart in smallest currency unit (e.g., cents), after applying all discounts, shipping, and taxes"
                        },
                        "total_tax": {
                            "type": "integer",
                            "description": "Total tax amount in smallest currency unit (e.g., cents), after applying all discounts, shipping, and taxes"
                        }
                    },
                    "additionalProperties": false
                },
                "extensions": {
                    "type": "object",
                    "description": "Additional cart extension data, this is similar to what's passed in Store API's extensions parameter"
                }
            },
            "additionalProperties": false
        },
        "checkout": {
            "type": "object",
            "description": "Checkout preferences and settings",
            "properties": {
                "create_account": {
                    "type": "boolean",
                    "description": "Whether the customer checked the create account checkbox, this will be false if the customer is logged in, cannot create an account, or forced to create an account."
                },
                "customer_note": {
                    "type": "string",
                    "description": "Customer's note or special instructions for the order, this will be empty if the customer didn't add a note."
                },
                "additional_fields": {
                    "type": "object",
                    "description": "Additional checkout fields, limited to the order location.",
                    "additionalProperties": {
                        "type": "string"
                    },
                    "patternProperties": {
                        "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$": {
                            "type": "string",
                            "description": "Custom fields with namespace identifiers"
                        }
                    }
                },
                "payment_method": {
                    "type": "string",
                    "description": "Selected payment method identifier, this will be the payment method ID regardless if the customer selected a saved payment method or new payment method"
                }
            },
            "additionalProperties": false
        },
        "customer": {
            "type": "object",
            "description": "Customer information",
            "properties": {
                "id": {
                    "type": "integer",
                    "description": "Customer ID, this will be 0 if the customer is not logged in"
                },
                "billing_address": {
                    "$ref": "#/definitions/address",
                    "description": "Customer's billing address"
                },
                "shipping_address": {
                    "$ref": "#/definitions/address",
                    "description": "Customer's shipping address"
                },
                "additional_fields": {
                    "type": "object",
                    "description": "Additional checkout fields, limited to the contact location.",
                    "additionalProperties": {
                        "type": "string"
                    }
                },
                "address": {
                    "$ref": "#/definitions/address",
                    "description": "This is a dynamic field that will be the billing or shipping address depending on the context of the field being evaluated."
                }
            },
            "additionalProperties": false
        }
    },
    "additionalProperties": false,
    "definitions": {
        "address": {
            "type": "object",
            "description": "Customer address information",
            "properties": {
                "first_name": {
                    "type": "string",
                    "description": "First name of the recipient"
                },
                "last_name": {
                    "type": "string",
                    "description": "Last name of the recipient"
                },
                "company": {
                    "type": "string",
                    "description": "Company name"
                },
                "address_1": {
                    "type": "string",
                    "description": "Primary address line"
                },
                "address_2": {
                    "type": "string",
                    "description": "Secondary address line"
                },
                "city": {
                    "type": "string",
                    "description": "City name"
                },
                "state": {
                    "type": "string",
                    "description": "State or province, this will be the state code if it's a predefined list, for example: CA, TX, NY, etc, or the field value if it's a freeform state, for example: London."
                },
                "postcode": {
                    "type": "string",
                    "description": "Postal or ZIP code"
                },
                "country": {
                    "type": "string",
                    "description": "Country code (e.g., US, UK)"
                },
                "email": {
                    "type": "string",
                    "description": "Email address"
                },
                "phone": {
                    "type": "string",
                    "description": "Phone number"
                }
            },
            "additionalProperties": {
                "type": "string",
                "description": "Custom fields with namespace identifiers"
            },
            "patternProperties": {
                "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$": {
                    "type": "string",
                    "description": "Custom fields with namespace identifiers"
                }
            }
        }
    }
}