changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$id": "https://howtomakemoneyonsnapchat.com/schemas/v1/calculate_growth_pace.output.schema.json",
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "additionalProperties": false,
+ "allOf": [
+ {
+ "description": "Fields present in every successful tool output.",
+ "properties": {
+ "api_version": {
+ "const": "v1"
+ },
+ "data_freshness": {
+ "additionalProperties": false,
+ "properties": {
+ "generated_at": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "newest_verified_at": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "oldest_verified_at": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "policy": {
+ "description": "Human-readable freshness policy, e.g. 'Sources are re-checked daily; rules not re-verified within 7 days are listed as stale.'",
+ "type": "string"
+ },
+ "rules_db_version": {
+ "description": "Monotonic version of the published rules set. Pattern YYYY-MM-DD.n",
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}\\.[0-9]+$",
+ "type": "string"
+ },
+ "stale_rule_ids": {
+ "description": "Rules in this response whose verified_at is older than the staleness window stated in `policy`.",
+ "items": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "rules_db_version",
+ "generated_at",
+ "oldest_verified_at",
+ "newest_verified_at",
+ "stale_rule_ids",
+ "policy"
+ ],
+ "type": "object"
+ },
+ "generated_at": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "notice": {
+ "const": "HowToMakeMoneyOnSnapchat.com is an independent third party and is not affiliated with, endorsed by, or sponsored by Snap Inc. Snapchat is a trademark of Snap Inc.",
+ "description": "Non-affiliation notice included in every response.",
+ "type": "string"
+ },
+ "sources": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "publisher": {
+ "type": "string"
+ },
+ "supports_rule_ids": {
+ "items": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "title": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ },
+ "verified_at": {
+ "format": "date",
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "publisher",
+ "verified_at",
+ "supports_rule_ids"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "tool": {
+ "type": "string"
+ },
+ "warnings": {
+ "description": "Plain strings. Omitted when empty. Calculation tools add a string when followers is 0 and view_time_hours_28d or spotlight_view_time_hours_28d is above 0, and when view_time_hours_28d exceeds 28 days × 24 hours × followers × 0.5. Those warnings say the figure is unusually high for your follower count, please check for a typo, and that view time can come from non-followers. They are never an error. FACT GET aliases append ignored query parameter notices to this same array. Spotlight hours above total view hours are HTTP 400 VALUE_INCONSISTENT rather than a warning.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "tool",
+ "api_version",
+ "notice",
+ "generated_at",
+ "sources",
+ "data_freshness"
+ ],
+ "type": "object"
+ }
+ ],
+ "properties": {
+ "already_enrolled": {
+ "type": "boolean"
+ },
+ "api_version": {
+ "const": "v1"
+ },
+ "data_freshness": {
+ "additionalProperties": false,
+ "properties": {
+ "generated_at": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "newest_verified_at": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "oldest_verified_at": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "policy": {
+ "description": "Human-readable freshness policy, e.g. 'Sources are re-checked daily; rules not re-verified within 7 days are listed as stale.'",
+ "type": "string"
+ },
+ "rules_db_version": {
+ "description": "Monotonic version of the published rules set. Pattern YYYY-MM-DD.n",
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}\\.[0-9]+$",
+ "type": "string"
+ },
+ "stale_rule_ids": {
+ "description": "Rules in this response whose verified_at is older than the staleness window stated in `policy`.",
+ "items": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "rules_db_version",
+ "generated_at",
+ "oldest_verified_at",
+ "newest_verified_at",
+ "stale_rule_ids",
+ "policy"
+ ],
+ "type": "object"
+ },
+ "facts": {
+ "items": {
+ "additionalProperties": false,
+ "description": "FACT: a rule record as stored in the versioned rules database (approved records only).",
+ "properties": {
+ "applies_to": {
+ "enum": [
+ "entry",
+ "enrolled_creators",
+ "all",
+ "not_applicable"
+ ],
+ "type": "string"
+ },
+ "changed_after": {
+ "description": "Inclusive start of an observed change window when the source does not state a single effective_date. Null when unknown. Additive.",
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "changed_before": {
+ "description": "Inclusive end of an observed change window when the source does not state a single effective_date. Null when unknown. Additive.",
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "claim": {
+ "type": "string"
+ },
+ "date_note": {
+ "description": "How changed_after and changed_before were established. Null when there is no window note. Not a substitute for source_url.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "effective_date": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "effective_date_note": {
+ "const": "not published by Snap",
+ "description": "Present when effective_date is null because Snap did not publish a date. effective_date stays null."
+ },
+ "iso_countries": {
+ "description": "ISO 3166-1 codes for each name in a country list, from the reviewed country map. Omitted unless this fact is a country list.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "alpha2": {
+ "type": "string"
+ },
+ "alpha3": {
+ "type": "string"
+ },
+ "numeric": {
+ "type": "string"
+ },
+ "snap_name": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "snap_name",
+ "alpha2",
+ "alpha3",
+ "numeric"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "label": {
+ "const": "FACT"
+ },
+ "metric": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "mvp_scope": {
+ "enum": [
+ "in_scope",
+ "out_of_scope"
+ ],
+ "type": "string"
+ },
+ "notes": {
+ "type": "string"
+ },
+ "operator": {
+ "enum": [
+ "gte",
+ "gt",
+ "lte",
+ "lt",
+ "eq",
+ "in",
+ "is_true",
+ null
+ ],
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "program": {
+ "description": "Program identifier. Validated at runtime against programs present in the rules database; unknown values return UNKNOWN_PROGRAM. Examples: unified_monetization_program, snap_star, creator_subscriptions, brand_partnerships, payouts, tax, recommendation_eligibility, creator_monetization_policy, public_profile, lens_creator_rewards.",
+ "pattern": "^[a-z0-9_]{2,64}$",
+ "type": "string"
+ },
+ "publisher": {
+ "type": "string"
+ },
+ "related_rule_ids": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "requirement_phase": {
+ "enum": [
+ "entry",
+ "ongoing",
+ "entry_and_ongoing",
+ "not_applicable"
+ ],
+ "type": "string"
+ },
+ "requires_user_confirmation": {
+ "type": "boolean"
+ },
+ "rule_id": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "rule_type": {
+ "description": "Role of the rule, copied from the rules database. Omitted by older clients. Used to group answer pages.",
+ "enum": [
+ "eligibility_threshold",
+ "eligibility_condition",
+ "ongoing_condition",
+ "payout_term",
+ "tax_term",
+ "content_policy",
+ "program_fact",
+ "program_status",
+ "supplementary_note",
+ null
+ ],
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "source_url": {
+ "format": "uri",
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "current",
+ "historical",
+ "unverified"
+ ],
+ "type": "string"
+ },
+ "supersedes": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "type": [
+ "number",
+ "string",
+ "boolean",
+ "null"
+ ]
+ },
+ {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ ]
+ },
+ "verified_at": {
+ "format": "date",
+ "type": "string"
+ },
+ "version": {
+ "minimum": 1,
+ "type": "integer"
+ },
+ "window_days": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "label",
+ "rule_id",
+ "version",
+ "program",
+ "claim",
+ "value",
+ "unit",
+ "status",
+ "source_url",
+ "publisher",
+ "verified_at",
+ "effective_date",
+ "requires_user_confirmation",
+ "applies_to",
+ "requirement_phase",
+ "mvp_scope",
+ "notes"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "generated_at": {
+ "format": "date-time",
+ "type": "string"
+ },
+ "notice": {
+ "const": "HowToMakeMoneyOnSnapchat.com is an independent third party and is not affiliated with, endorsed by, or sponsored by Snap Inc. Snapchat is a trademark of Snap Inc.",
+ "description": "Non-affiliation notice included in every response.",
+ "type": "string"
+ },
+ "ongoing_paces": {
+ "additionalProperties": false,
+ "description": "null unless already_enrolled=true.",
+ "properties": {
+ "note": {
+ "const": "Ongoing requirements apply only to creators already enrolled in the Monetization Program. Snap says the 100-hour Spotlight view-time requirement is needed to qualify for maximum Creator Rewards; Snap does not say that rewards stop below it."
+ },
+ "paces": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "already_met": {
+ "type": "boolean"
+ },
+ "current": {
+ "type": "number"
+ },
+ "gap": {
+ "minimum": 0,
+ "type": "number"
+ },
+ "metric": {
+ "enum": [
+ "followers",
+ "view_time_hours_28d",
+ "spotlight_view_time_hours_28d",
+ "posts_per_month",
+ "active_posting_days_28d"
+ ],
+ "type": "string"
+ },
+ "metric_kind": {
+ "enum": [
+ "cumulative",
+ "rolling_window"
+ ],
+ "type": "string"
+ },
+ "observed_daily_change": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_to_observed_ratio": {
+ "description": "linear required_daily / observed_daily_change; null if observed not supplied or <= 0.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "rule_id": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "scenarios": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "assumptions": {
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "computable": {
+ "type": "boolean"
+ },
+ "formula": {
+ "type": "string"
+ },
+ "label": {
+ "const": "CALCULATION"
+ },
+ "name": {
+ "description": "linear: shortfall divided by the caller-chosen days, (T - C) / N. Used for cumulative metrics and for rolling-window metrics. compound: constant daily % growth (cumulative metrics; not computable when current = 0). rolling_window_replacement remains in the enum and is not produced.",
+ "enum": [
+ "linear",
+ "compound",
+ "rolling_window_replacement"
+ ],
+ "type": "string"
+ },
+ "not_computable_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "required_daily": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_daily_growth_rate_pct": {
+ "description": "compound scenario only",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_weekly": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "unit": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "label",
+ "name",
+ "computable",
+ "required_daily",
+ "required_weekly",
+ "unit",
+ "formula",
+ "assumptions"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "threshold": {
+ "type": "number"
+ },
+ "window_days": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "rule_id",
+ "metric",
+ "metric_kind",
+ "current",
+ "threshold",
+ "gap",
+ "scenarios"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "note",
+ "paces"
+ ],
+ "type": [
+ "object",
+ "null"
+ ]
+ },
+ "paces": {
+ "description": "Entry requirements only.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "already_met": {
+ "type": "boolean"
+ },
+ "current": {
+ "type": "number"
+ },
+ "gap": {
+ "minimum": 0,
+ "type": "number"
+ },
+ "metric": {
+ "enum": [
+ "followers",
+ "view_time_hours_28d",
+ "spotlight_view_time_hours_28d",
+ "posts_per_month",
+ "active_posting_days_28d"
+ ],
+ "type": "string"
+ },
+ "metric_kind": {
+ "enum": [
+ "cumulative",
+ "rolling_window"
+ ],
+ "type": "string"
+ },
+ "observed_daily_change": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_to_observed_ratio": {
+ "description": "linear required_daily / observed_daily_change; null if observed not supplied or <= 0.",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "rule_id": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "scenarios": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "assumptions": {
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "computable": {
+ "type": "boolean"
+ },
+ "formula": {
+ "type": "string"
+ },
+ "label": {
+ "const": "CALCULATION"
+ },
+ "name": {
+ "description": "linear: shortfall divided by the caller-chosen days, (T - C) / N. Used for cumulative metrics and for rolling-window metrics. compound: constant daily % growth (cumulative metrics; not computable when current = 0). rolling_window_replacement remains in the enum and is not produced.",
+ "enum": [
+ "linear",
+ "compound",
+ "rolling_window_replacement"
+ ],
+ "type": "string"
+ },
+ "not_computable_reason": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "required_daily": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_daily_growth_rate_pct": {
+ "description": "compound scenario only",
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "required_weekly": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "unit": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "label",
+ "name",
+ "computable",
+ "required_daily",
+ "required_weekly",
+ "unit",
+ "formula",
+ "assumptions"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "threshold": {
+ "type": "number"
+ },
+ "window_days": {
+ "type": [
+ "integer",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "rule_id",
+ "metric",
+ "metric_kind",
+ "current",
+ "threshold",
+ "gap",
+ "scenarios"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "program": {
+ "description": "Program identifier. Validated at runtime against programs present in the rules database; unknown values return UNKNOWN_PROGRAM. Examples: unified_monetization_program, snap_star, creator_subscriptions, brand_partnerships, payouts, tax, recommendation_eligibility, creator_monetization_policy, public_profile, lens_creator_rewards.",
+ "pattern": "^[a-z0-9_]{2,64}$",
+ "type": "string"
+ },
+ "projection_disclaimer": {
+ "const": "Projections show the pace required under stated assumptions. They are not predictions of what will happen."
+ },
+ "recommendations": {
+ "items": {
+ "additionalProperties": false,
+ "description": "RECOMMENDATION: our suggestion, never a Snap rule. Short and structured; the calling agent writes prose.",
+ "properties": {
+ "assumptions": {
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "label": {
+ "const": "RECOMMENDATION"
+ },
+ "linked_rule_id": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "measurable_target": {
+ "additionalProperties": false,
+ "properties": {
+ "by_date": {
+ "format": "date",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "metric": {
+ "description": "Closed vocabulary of creator metrics the engines understand.",
+ "enum": [
+ "followers",
+ "view_time_hours_28d",
+ "spotlight_view_time_hours_28d",
+ "meets_age_requirement",
+ "country",
+ "is_snap_star",
+ "posts_per_month",
+ "active_posting_days_28d"
+ ],
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "metric",
+ "value",
+ "unit"
+ ],
+ "type": "object"
+ },
+ "objective": {
+ "maxLength": 200,
+ "type": "string"
+ },
+ "order": {
+ "description": "1 = address first (the binding constraint). An ordering, not a score.",
+ "minimum": 1,
+ "type": "integer"
+ },
+ "realism_note": {
+ "description": "Plain statement when the math is unrealistic, e.g. 'Required pace is 20x your observed pace.'",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "reason": {
+ "maxLength": 300,
+ "type": "string"
+ },
+ "risks": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "label",
+ "objective",
+ "reason",
+ "linked_rule_id",
+ "measurable_target",
+ "assumptions",
+ "risks"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "sources": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "publisher": {
+ "type": "string"
+ },
+ "supports_rule_ids": {
+ "items": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "title": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "url": {
+ "format": "uri",
+ "type": "string"
+ },
+ "verified_at": {
+ "format": "date",
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "publisher",
+ "verified_at",
+ "supports_rule_ids"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "target_date": {
+ "format": "date",
+ "type": "string"
+ },
+ "target_days": {
+ "type": "integer"
+ },
+ "tool": {
+ "const": "calculate_growth_pace"
+ },
+ "unknowns": {
+ "items": {
+ "additionalProperties": false,
+ "description": "A requirement we could not evaluate, with the reason and what would resolve it.",
+ "properties": {
+ "how_to_resolve": {
+ "type": "string"
+ },
+ "missing_metric": {
+ "anyOf": [
+ {
+ "description": "Closed vocabulary of creator metrics the engines understand.",
+ "enum": [
+ "followers",
+ "view_time_hours_28d",
+ "spotlight_view_time_hours_28d",
+ "meets_age_requirement",
+ "country",
+ "is_snap_star",
+ "posts_per_month",
+ "active_posting_days_28d"
+ ],
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "reason": {
+ "enum": [
+ "missing_input",
+ "rule_unverified",
+ "requires_user_confirmation",
+ "not_computable_from_metrics",
+ "rule_value_not_numeric"
+ ],
+ "type": "string"
+ },
+ "rule_id": {
+ "maxLength": 120,
+ "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "rule_id",
+ "reason",
+ "how_to_resolve"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "warnings": {
+ "description": "Plain strings. Omitted when empty. Calculation tools add a string when followers is 0 and view_time_hours_28d or spotlight_view_time_hours_28d is above 0, and when view_time_hours_28d exceeds 28 days × 24 hours × followers × 0.5. Those warnings say the figure is unusually high for your follower count, please check for a typo, and that view time can come from non-followers. They are never an error. FACT GET aliases append ignored query parameter notices to this same array. Spotlight hours above total view hours are HTTP 400 VALUE_INCONSISTENT rather than a warning.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ }
+ },
+ "required": [
+ "tool",
+ "api_version",
+ "notice",
+ "generated_at",
+ "sources",
+ "data_freshness",
+ "program",
+ "already_enrolled",
+ "target_days",
+ "target_date",
+ "paces",
+ "ongoing_paces",
+ "projection_disclaimer",
+ "unknowns",
+ "facts",
+ "recommendations"
+ ],
+ "title": "calculate_growth_pace output",
+ "type": "object"
+}