calculate_gap output

CompanySnapchatMonetizationCalculatorRules

Properties

Name Type Description
tool object
api_version object
notice object
generated_at object
sources array
data_freshness object
warnings array 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
program object
already_enrolled boolean
gaps array Entry requirements only.
ongoing_gaps objectnull null unless already_enrolled=true.
binding_constraint objectnull
unknowns array
facts array
recommendations array
View JSON Schema on GitHub

JSON Schema

howtomakemoneyonsnapchat-com-calculate-gap-output-schema-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://howtomakemoneyonsnapchat.com/schemas/v1/calculate_gap.output.schema.json",
  "title": "calculate_gap output",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/howtomakemoneyonsnapchat-com-openapi.json#/components/schemas/calculate_gap.output.schema",
  "type": "object",
  "additionalProperties": false,
  "allOf": [
    {
      "$ref": "#/$defs/Envelope"
    }
  ],
  "required": [
    "tool",
    "api_version",
    "notice",
    "generated_at",
    "sources",
    "data_freshness",
    "program",
    "already_enrolled",
    "gaps",
    "ongoing_gaps",
    "binding_constraint",
    "unknowns",
    "facts",
    "recommendations"
  ],
  "properties": {
    "tool": {
      "const": "calculate_gap"
    },
    "api_version": {
      "const": "v1"
    },
    "notice": {
      "$ref": "#/$defs/Notice"
    },
    "generated_at": {
      "$ref": "#/$defs/DateTime"
    },
    "sources": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Source"
      }
    },
    "data_freshness": {
      "$ref": "#/$defs/DataFreshness"
    },
    "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.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "program": {
      "$ref": "#/$defs/ProgramSlug"
    },
    "already_enrolled": {
      "type": "boolean"
    },
    "gaps": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "label",
          "rule_id",
          "rule_version",
          "metric",
          "unit",
          "threshold",
          "current",
          "met",
          "shortfall_absolute",
          "percent_complete",
          "percent_complete_uncapped",
          "formula"
        ],
        "properties": {
          "label": {
            "const": "CALCULATION"
          },
          "rule_id": {
            "$ref": "#/$defs/RuleId"
          },
          "rule_version": {
            "type": "integer"
          },
          "metric": {
            "$ref": "#/$defs/NumericMetricName"
          },
          "unit": {
            "type": "string"
          },
          "window_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "threshold": {
            "type": "number"
          },
          "current": {
            "type": "number"
          },
          "met": {
            "type": "boolean"
          },
          "shortfall_absolute": {
            "type": "number",
            "minimum": 0,
            "description": "max(threshold - current, 0)"
          },
          "surplus_absolute": {
            "type": "number",
            "minimum": 0,
            "description": "max(current - threshold, 0)"
          },
          "percent_complete": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "min(current / threshold, 1) * 100, rounded to 2 dp"
          },
          "percent_complete_uncapped": {
            "type": "number",
            "minimum": 0
          },
          "formula": {
            "type": "string"
          }
        }
      },
      "description": "Entry requirements only."
    },
    "ongoing_gaps": {
      "description": "null unless already_enrolled=true.",
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "note",
        "gaps"
      ],
      "properties": {
        "note": {
          "$ref": "#/$defs/OngoingNote"
        },
        "gaps": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "label",
              "rule_id",
              "rule_version",
              "metric",
              "unit",
              "threshold",
              "current",
              "met",
              "shortfall_absolute",
              "percent_complete",
              "percent_complete_uncapped",
              "formula"
            ],
            "properties": {
              "label": {
                "const": "CALCULATION"
              },
              "rule_id": {
                "$ref": "#/$defs/RuleId"
              },
              "rule_version": {
                "type": "integer"
              },
              "metric": {
                "$ref": "#/$defs/NumericMetricName"
              },
              "unit": {
                "type": "string"
              },
              "window_days": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "threshold": {
                "type": "number"
              },
              "current": {
                "type": "number"
              },
              "met": {
                "type": "boolean"
              },
              "shortfall_absolute": {
                "type": "number",
                "minimum": 0,
                "description": "max(threshold - current, 0)"
              },
              "surplus_absolute": {
                "type": "number",
                "minimum": 0,
                "description": "max(current - threshold, 0)"
              },
              "percent_complete": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "min(current / threshold, 1) * 100, rounded to 2 dp"
              },
              "percent_complete_uncapped": {
                "type": "number",
                "minimum": 0
              },
              "formula": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "binding_constraint": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "rule_id",
        "metric",
        "percent_complete",
        "rule"
      ],
      "properties": {
        "rule_id": {
          "$ref": "#/$defs/RuleId"
        },
        "metric": {
          "$ref": "#/$defs/NumericMetricName"
        },
        "percent_complete": {
          "type": "number"
        },
        "rule": {
          "const": "unmet requirement with the lowest percent_complete; ties broken by rule_id"
        }
      }
    },
    "unknowns": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Unknown"
      }
    },
    "facts": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/RuleFact"
      }
    },
    "recommendations": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Recommendation"
      }
    }
  },
  "$defs": {
    "DataFreshness": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "rules_db_version",
        "generated_at",
        "oldest_verified_at",
        "newest_verified_at",
        "stale_rule_ids",
        "policy"
      ],
      "properties": {
        "rules_db_version": {
          "description": "Monotonic version of the published rules set. Pattern YYYY-MM-DD.n",
          "type": "string",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}\\.[0-9]+$"
        },
        "generated_at": {
          "$ref": "#/$defs/DateTime"
        },
        "oldest_verified_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date"
        },
        "newest_verified_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date"
        },
        "oldest_last_checked_at": {
          "description": "Earliest last_checked_at among rules in this response. Omitted when none of those rules have an unchanged-source check. Does not replace oldest_verified_at.",
          "type": "string",
          "format": "date-time"
        },
        "newest_last_checked_at": {
          "description": "Latest last_checked_at among rules in this response. Omitted when none of those rules have an unchanged-source check. Does not replace newest_verified_at.",
          "type": "string",
          "format": "date-time"
        },
        "stale_rule_ids": {
          "description": "Rules in this response whose later of verified_at and last_checked_at is older than the staleness window stated in `policy`. A missing last_checked_at does not count.",
          "type": "array",
          "items": {
            "$ref": "#/$defs/RuleId"
          }
        },
        "policy": {
          "type": "string",
          "description": "Human-readable freshness policy, e.g. 'Sources are re-checked daily; a rule is listed as stale when the later of verified_at and last_checked_at is more than 7 days before the response date.'"
        }
      }
    },
    "Date": {
      "type": "string",
      "format": "date"
    },
    "DateTime": {
      "type": "string",
      "format": "date-time"
    },
    "EffectiveDateNote": {
      "description": "Present when effective_date is null because Snap did not publish a date. effective_date stays null.",
      "const": "not published by Snap"
    },
    "Envelope": {
      "description": "Fields present in every successful tool output.",
      "type": "object",
      "required": [
        "tool",
        "api_version",
        "notice",
        "generated_at",
        "sources",
        "data_freshness"
      ],
      "properties": {
        "tool": {
          "type": "string"
        },
        "api_version": {
          "const": "v1"
        },
        "notice": {
          "$ref": "#/$defs/Notice"
        },
        "generated_at": {
          "$ref": "#/$defs/DateTime"
        },
        "sources": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Source"
          }
        },
        "data_freshness": {
          "$ref": "#/$defs/DataFreshness"
        },
        "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.",
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "IsoCountry": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "snap_name",
        "alpha2",
        "alpha3",
        "numeric"
      ],
      "properties": {
        "snap_name": {
          "type": "string"
        },
        "alpha2": {
          "type": "string"
        },
        "alpha3": {
          "type": "string"
        },
        "numeric": {
          "type": "string"
        }
      }
    },
    "MetricName": {
      "description": "Closed vocabulary of creator metrics the engines understand.",
      "type": "string",
      "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"
      ]
    },
    "Notice": {
      "description": "Non-affiliation notice included in every response.",
      "type": "string",
      "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."
    },
    "NumericMetricName": {
      "type": "string",
      "enum": [
        "followers",
        "view_time_hours_28d",
        "spotlight_view_time_hours_28d",
        "posts_per_month",
        "active_posting_days_28d"
      ]
    },
    "OngoingNote": {
      "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."
    },
    "ProgramSlug": {
      "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.",
      "type": "string",
      "pattern": "^[a-z0-9_]{2,64}$"
    },
    "Recommendation": {
      "description": "RECOMMENDATION: our suggestion, never a Snap rule. Short and structured; the calling agent writes prose.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "label",
        "objective",
        "reason",
        "linked_rule_id",
        "measurable_target",
        "assumptions",
        "risks"
      ],
      "properties": {
        "label": {
          "const": "RECOMMENDATION"
        },
        "order": {
          "description": "1 = address first (the binding constraint). An ordering, not a score.",
          "type": "integer",
          "minimum": 1
        },
        "objective": {
          "type": "string",
          "maxLength": 200
        },
        "reason": {
          "type": "string",
          "maxLength": 300
        },
        "linked_rule_id": {
          "$ref": "#/$defs/RuleId"
        },
        "measurable_target": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "metric",
            "value",
            "unit"
          ],
          "properties": {
            "metric": {
              "$ref": "#/$defs/MetricName"
            },
            "value": {
              "type": "number"
            },
            "unit": {
              "type": "string"
            },
            "by_date": {
              "type": [
                "string",
                "null"
              ],
              "format": "date"
            }
          }
        },
        "assumptions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1
        },
        "risks": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "realism_note": {
          "type": [
            "string",
            "null"
          ],
          "description": "Plain statement when the math is unrealistic, e.g. 'Required pace is 20x your observed pace.'"
        }
      }
    },
    "RuleFact": {
      "description": "FACT: a rule record as stored in the versioned rules database (approved records only).",
      "type": "object",
      "additionalProperties": false,
      "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"
      ],
      "properties": {
        "label": {
          "const": "FACT"
        },
        "rule_id": {
          "$ref": "#/$defs/RuleId"
        },
        "version": {
          "type": "integer",
          "minimum": 1
        },
        "program": {
          "$ref": "#/$defs/ProgramSlug"
        },
        "claim": {
          "type": "string"
        },
        "value": {
          "anyOf": [
            {
              "type": [
                "number",
                "string",
                "boolean",
                "null"
              ]
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        },
        "unit": {
          "type": "string"
        },
        "metric": {
          "type": [
            "string",
            "null"
          ]
        },
        "operator": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "gte",
            "gt",
            "lte",
            "lt",
            "eq",
            "in",
            "is_true",
            null
          ]
        },
        "window_days": {
          "type": [
            "integer",
            "null"
          ]
        },
        "rule_type": {
          "description": "Role of the rule, copied from the rules database. Omitted by older clients. Used to group answer pages.",
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "eligibility_threshold",
            "eligibility_condition",
            "ongoing_condition",
            "payout_term",
            "tax_term",
            "content_policy",
            "program_fact",
            "program_status",
            "supplementary_note",
            null
          ]
        },
        "status": {
          "type": "string",
          "enum": [
            "current",
            "historical",
            "unverified"
          ]
        },
        "source_url": {
          "type": "string",
          "format": "uri"
        },
        "publisher": {
          "type": "string"
        },
        "verified_at": {
          "$ref": "#/$defs/Date"
        },
        "last_checked_at": {
          "description": "ISO-8601 timestamp of the latest automated check that found this rule's official source text unchanged. Omitted when no such check is recorded. Does not replace verified_at and is not a rule value.",
          "type": "string",
          "format": "date-time"
        },
        "effective_date": {
          "type": [
            "string",
            "null"
          ],
          "format": "date"
        },
        "effective_date_note": {
          "$ref": "#/$defs/EffectiveDateNote"
        },
        "changed_after": {
          "description": "Inclusive start of an observed change window when the source does not state a single effective_date. Null when unknown. Additive.",
          "type": [
            "string",
            "null"
          ],
          "format": "date"
        },
        "changed_before": {
          "description": "Inclusive end of an observed change window when the source does not state a single effective_date. Null when unknown. Additive.",
          "type": [
            "string",
            "null"
          ],
          "format": "date"
        },
        "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"
          ]
        },
        "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.",
          "type": "array",
          "items": {
            "$ref": "#/$defs/IsoCountry"
          }
        },
        "requires_user_confirmation": {
          "type": "boolean"
        },
        "supersedes": {
          "type": [
            "string",
            "null"
          ]
        },
        "applies_to": {
          "type": "string",
          "enum": [
            "entry",
            "enrolled_creators",
            "all",
            "not_applicable"
          ]
        },
        "requirement_phase": {
          "type": "string",
          "enum": [
            "entry",
            "ongoing",
            "entry_and_ongoing",
            "not_applicable"
          ]
        },
        "mvp_scope": {
          "type": "string",
          "enum": [
            "in_scope",
            "out_of_scope"
          ]
        },
        "related_rule_ids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "notes": {
          "type": "string"
        }
      }
    },
    "RuleId": {
      "type": "string",
      "pattern": "^[a-z0-9_]+(\\.[a-z0-9_]+)+$",
      "maxLength": 120
    },
    "Source": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "url",
        "publisher",
        "verified_at",
        "supports_rule_ids"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri"
        },
        "publisher": {
          "type": "string"
        },
        "title": {
          "type": [
            "string",
            "null"
          ]
        },
        "verified_at": {
          "$ref": "#/$defs/Date"
        },
        "last_checked_at": {
          "description": "ISO-8601 timestamp of the latest automated check that found this source's official text unchanged. Omitted when no such check is recorded. Does not replace verified_at.",
          "type": "string",
          "format": "date-time"
        },
        "supports_rule_ids": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/RuleId"
          }
        }
      }
    },
    "Unknown": {
      "description": "A requirement we could not evaluate, with the reason and what would resolve it.",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "rule_id",
        "reason",
        "how_to_resolve"
      ],
      "properties": {
        "rule_id": {
          "$ref": "#/$defs/RuleId"
        },
        "reason": {
          "type": "string",
          "enum": [
            "missing_input",
            "rule_unverified",
            "requires_user_confirmation",
            "not_computable_from_metrics",
            "rule_value_not_numeric"
          ]
        },
        "missing_metric": {
          "anyOf": [
            {
              "$ref": "#/$defs/MetricName"
            },
            {
              "type": "null"
            }
          ]
        },
        "how_to_resolve": {
          "type": "string"
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/howtomakemoneyonsnapchat-com-calculate-gap-output-schema"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.