{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "$id": "https://helpcompare.com/data/schema/tools.schema.json",
    "title": "HelpCompare B2B Software Pricing Dataset",
    "description": "Field definitions for https://helpcompare.com/data/tools.json (CSV columns with the same name mean the same thing). Every price was recorded from the vendor's own pricing page. null is never zero: it means not published or not yet recorded.",
    "type": "object",
    "required": [
        "dataset",
        "license",
        "generated",
        "tools"
    ],
    "properties": {
        "$schema": {
            "type": "string",
            "description": "URL of this JSON Schema.",
            "format": "uri"
        },
        "dataset": {
            "type": "string",
            "description": "Dataset name."
        },
        "description": {
            "type": "string",
            "description": "What the dataset contains."
        },
        "license": {
            "type": "string",
            "description": "Licence URL (CC BY 4.0: reuse freely, credit HelpCompare and link to the source page).",
            "format": "uri"
        },
        "attribution": {
            "type": "string",
            "description": "The credit line to use when reusing the data."
        },
        "generated": {
            "type": "string",
            "description": "When this file was generated (UTC, ISO 8601).",
            "format": "date-time"
        },
        "record_count": {
            "type": "integer",
            "description": "Number of records in the file.",
            "minimum": 0
        },
        "notes": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Plain-English reading notes for the fields."
        },
        "tools": {
            "type": "array",
            "description": "One record per tool.",
            "items": {
                "type": "object",
                "required": [
                    "slug",
                    "name",
                    "category",
                    "entry_price_usd",
                    "entry_price_text",
                    "last_verified"
                ],
                "properties": {
                    "slug": {
                        "type": "string",
                        "description": "Stable identifier, also the /tools/<slug>/ path."
                    },
                    "name": {
                        "type": "string",
                        "description": "Product name."
                    },
                    "category": {
                        "type": "string",
                        "description": "HelpCompare software category."
                    },
                    "official_site": {
                        "type": "string",
                        "description": "Vendor homepage.",
                        "format": "uri"
                    },
                    "helpcompare_url": {
                        "type": "string",
                        "description": "HelpCompare entity page for the tool.",
                        "format": "uri"
                    },
                    "entry_price_usd": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Lowest published monthly entry price in US dollars, before add-ons, seat minimums and annual discounts. 0 means the vendor publishes a genuine $0 plan or the software itself is free (see free_plan and entry_price_text). null means no flat monthly price is published (quote-only or percentage-of-transaction pricing): never read null as free or as $0.",
                        "minimum": 0
                    },
                    "entry_price_unit": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "What entry_price_usd buys: \"user\" = per user/seat per month; \"account\" = flat per account or workspace per month (see entry_price_included_users). null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free.",
                        "enum": [
                            "user",
                            "account",
                            null
                        ]
                    },
                    "entry_price_unit_label": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "The billing unit as the vendor states it. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "entry_price_included_users": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Users included in an account-priced entry plan. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free.",
                        "minimum": 0
                    },
                    "entry_price_min_users": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Minimum seats the entry plan must be bought for. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free.",
                        "minimum": 0
                    },
                    "entry_price_unit_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Vendor page the billing unit was read from.",
                        "format": "uri"
                    },
                    "entry_price_text": {
                        "type": "string",
                        "description": "The entry price in words, as recorded on the source page (always present, including for quote-only or percentage pricing)."
                    },
                    "entry_price_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "HelpCompare comparison page the entry price was verified on.",
                        "format": "uri"
                    },
                    "free_plan": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Whether a permanent free plan exists, in words. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "free_trial": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Free-trial terms, in words. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "pricing_model": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "How the vendor prices the product, in words. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "ai_feature": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Name of the vendor's main AI feature. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "ai_pricing_model": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "How the AI feature is billed. Values in use: \"Bundled free\", \"Flat-fee add-on\", \"Metered / credit-based\", \"Custom quote hybrid\", \"New — pricing unclear\", \"No major AI push\". null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "ai_pricing_detail": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "What the AI billing model means on the invoice. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "rating": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Review-site star rating (0-5) as of rating_checked. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free.",
                        "minimum": 0,
                        "maximum": 5
                    },
                    "review_count": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Number of reviews behind the rating as of rating_checked; changes daily. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free.",
                        "minimum": 0
                    },
                    "rating_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Review site the rating came from (G2). null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "rating_listing": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Name of the review-site listing when it differs from the product name. null means the vendor does not publish this or it has not been recorded yet; it never means zero, no, or free."
                    },
                    "rating_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Review-site listing URL.",
                        "format": "uri"
                    },
                    "rating_checked": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Date the rating and review count were read.",
                        "format": "date"
                    },
                    "rating_note": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Caveat about the rating, if any."
                    },
                    "last_verified": {
                        "type": "string",
                        "description": "Date the source comparison page was last re-checked against vendor pages.",
                        "format": "date"
                    },
                    "comparisons": {
                        "type": "array",
                        "description": "HelpCompare comparisons that include this tool.",
                        "items": {
                            "type": "object",
                            "required": [
                                "title",
                                "url"
                            ],
                            "properties": {
                                "title": {
                                    "type": "string",
                                    "description": "Comparison title."
                                },
                                "url": {
                                    "type": "string",
                                    "description": "Comparison page.",
                                    "format": "uri"
                                },
                                "last_verified": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Date that comparison was last re-checked; null if not recorded.",
                                    "format": "date"
                                }
                            }
                        }
                    },
                    "migrations_from": {
                        "type": "array",
                        "description": "Migration guides for moving from this tool to another.",
                        "items": {
                            "type": "object",
                            "required": [
                                "to",
                                "url"
                            ],
                            "properties": {
                                "to": {
                                    "type": "string",
                                    "description": "Tool name."
                                },
                                "url": {
                                    "type": "string",
                                    "description": "HelpCompare migration guide.",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "migrations_to": {
                        "type": "array",
                        "description": "Migration guides for moving to this tool from another.",
                        "items": {
                            "type": "object",
                            "required": [
                                "from",
                                "url"
                            ],
                            "properties": {
                                "from": {
                                    "type": "string",
                                    "description": "Tool name."
                                },
                                "url": {
                                    "type": "string",
                                    "description": "HelpCompare migration guide.",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}