{
  "$id": "https://aso.fastemy.com/data/aso-cases.schema.json",
  "title": "Fastemy ASO case record",
  "description": "One publicly reported App Store or Google Play result: an app, A/B test, study or benchmark that measurably changed installs, conversion, rankings, ratings or revenue after a store change. In aso-cases.json each record also has an \"id\" (the file name).",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "app",
        "experiment",
        "study",
        "benchmark"
      ]
    },
    "app": {
      "type": "string",
      "minLength": 1
    },
    "app_disclosed": {
      "type": "boolean"
    },
    "developer": {
      "default": null,
      "type": [
        "string",
        "null"
      ]
    },
    "stores": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "app-store",
          "google-play"
        ]
      }
    },
    "app_store_id": {
      "default": null,
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{6,12}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "play_package": {
      "default": null,
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[A-Za-z0-9_]+(\\.[A-Za-z0-9_]+)+$"
        },
        {
          "type": "null"
        }
      ]
    },
    "category": {
      "type": "string",
      "enum": [
        "games",
        "education",
        "health-fitness",
        "medical",
        "finance",
        "productivity",
        "business",
        "utilities",
        "photo-video",
        "entertainment",
        "music",
        "social",
        "lifestyle",
        "shopping",
        "food-drink",
        "travel",
        "navigation",
        "news",
        "reference",
        "books",
        "sports",
        "weather",
        "kids",
        "dating",
        "developer-tools",
        "multiple",
        "other"
      ]
    },
    "monetization": {
      "default": "unknown",
      "type": "string",
      "enum": [
        "free",
        "ads",
        "freemium",
        "subscription",
        "paid",
        "unknown"
      ]
    },
    "company_size": {
      "default": "unknown",
      "type": "string",
      "enum": [
        "solo",
        "startup",
        "smb",
        "mid-market",
        "enterprise",
        "unknown"
      ]
    },
    "hq_country": {
      "default": null,
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[A-Z]{2}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "markets": {
      "default": [],
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Z]{2}$"
      }
    },
    "headline": {
      "type": "object",
      "properties": {
        "en": {
          "type": "string",
          "minLength": 1
        },
        "tr": {
          "type": "string",
          "minLength": 1
        }
      },
      "required": [
        "en",
        "tr"
      ],
      "additionalProperties": false
    },
    "result": {
      "default": "positive",
      "type": "string",
      "enum": [
        "positive",
        "mixed",
        "null",
        "negative"
      ]
    },
    "metrics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "installs",
              "organic_installs",
              "search_installs",
              "conversion_rate",
              "impressions",
              "product_page_views",
              "keyword_rank",
              "keywords_ranked",
              "top10_keywords",
              "category_rank",
              "top_charts",
              "revenue",
              "ratings_count",
              "rating_avg",
              "retention",
              "other"
            ]
          },
          "label": {
            "type": "string",
            "minLength": 1
          },
          "before": {
            "default": null,
            "type": [
              "number",
              "null"
            ]
          },
          "after": {
            "default": null,
            "type": [
              "number",
              "null"
            ]
          },
          "value": {
            "default": null,
            "type": [
              "number",
              "null"
            ]
          },
          "unit": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "change_pct": {
            "default": null,
            "type": [
              "number",
              "null"
            ]
          },
          "period": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "store": {
            "default": null,
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "app-store",
                  "google-play"
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "type",
          "label"
        ],
        "additionalProperties": false
      }
    },
    "tactics": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "app-name-title",
          "subtitle",
          "keyword-field",
          "short-description",
          "long-description",
          "keyword-research",
          "localization",
          "screenshots",
          "app-preview-video",
          "icon",
          "feature-graphic",
          "ratings-reviews",
          "review-replies",
          "in-app-events",
          "promotional-content",
          "custom-product-pages",
          "custom-store-listings",
          "product-page-optimization",
          "store-listing-experiments",
          "featuring",
          "category",
          "app-quality",
          "release-cadence",
          "seasonal-updates",
          "paid-ua-halo",
          "apple-search-ads",
          "web-to-app",
          "pricing",
          "manipulation",
          "other"
        ]
      }
    },
    "timeframe": {
      "default": {
        "start": null,
        "end": null,
        "duration_months": null
      },
      "type": "object",
      "properties": {
        "start": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$"
            },
            {
              "type": "null"
            }
          ]
        },
        "end": {
          "default": null,
          "anyOf": [
            {
              "type": "string",
              "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$"
            },
            {
              "type": "null"
            }
          ]
        },
        "duration_months": {
          "default": null,
          "type": [
            "number",
            "null"
          ]
        }
      },
      "additionalProperties": false
    },
    "executed_by": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "in-house",
            "agency",
            "vendor",
            "individual",
            "researchers",
            "unknown"
          ]
        },
        "name": {
          "default": null,
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    "tools": {
      "default": [],
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "sources": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string",
            "minLength": 1
          },
          "publisher": {
            "type": "string",
            "minLength": 1
          },
          "type": {
            "type": "string",
            "enum": [
              "first-party",
              "platform",
              "agency",
              "vendor",
              "press",
              "research",
              "social",
              "podcast-video"
            ]
          },
          "published": {
            "default": null,
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d{4}(-\\d{2}(-\\d{2})?)?$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "url",
          "title",
          "publisher",
          "type"
        ],
        "additionalProperties": false
      }
    },
    "evidence": {
      "type": "string",
      "enum": [
        "A",
        "B",
        "C"
      ]
    },
    "conflict_of_interest": {
      "type": "boolean"
    },
    "notes": {
      "type": "object",
      "properties": {
        "en": {
          "type": "string",
          "minLength": 1
        },
        "tr": {
          "type": "string",
          "minLength": 1
        }
      },
      "required": [
        "en",
        "tr"
      ],
      "additionalProperties": false
    },
    "added": {
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    },
    "verified": {
      "type": "string",
      "format": "date",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
    },
    "id": {
      "type": "string"
    }
  },
  "required": [
    "kind",
    "app",
    "app_disclosed",
    "stores",
    "category",
    "headline",
    "metrics",
    "tactics",
    "executed_by",
    "sources",
    "evidence",
    "conflict_of_interest",
    "added",
    "verified"
  ],
  "additionalProperties": false
}