{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/gloom-sh/json-schema/gloom-sh-apps-company-response-schema.json",
  "title": "AppsCompanyResponse",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/gloom-sh-openapi.json#/components/schemas/AppsCompanyResponse",
  "type": "object",
  "required": [
    "data",
    "meta"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "allOf": [
          {
            "$ref": "#/$defs/Listed"
          },
          {
            "$ref": "#/$defs/CompanyAppRank"
          }
        ]
      }
    },
    "included": {
      "type": "object",
      "description": "The blocks asked for with include=, each keyed by listing.",
      "properties": {
        "summary": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "appCount": {
                "type": "integer",
                "description": "Apps."
              },
              "companyCount": {
                "type": "integer",
                "description": "Companies."
              },
              "countryCount": {
                "type": "integer",
                "description": "Countries."
              },
              "observationCount": {
                "type": "integer",
                "description": "Chart reads."
              },
              "mappedObservationCount": {
                "type": "integer",
                "description": "Reads of apps mapped to a company."
              },
              "attentionScore": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Combined rank and rating momentum."
              },
              "rankVelocity7d": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rank change per day over 7 days."
              },
              "ratingChange7d": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rating change in 7 days."
              },
              "ratingCountGrowth7d": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Growth in ratings over 7 days."
              },
              "comparableSeries7d": {
                "type": "integer",
                "description": "Series with a read 7 days earlier."
              },
              "firstObservedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date",
                "description": "The first day read."
              },
              "lastObservedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "The latest read."
              }
            }
          },
          "description": "Counts and attention scores across the result."
        },
        "companies": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "symbol": {
                  "type": "string",
                  "description": "Listing symbol."
                },
                "name": {
                  "type": "string",
                  "description": "Name."
                },
                "appCount": {
                  "type": "integer",
                  "description": "Apps."
                },
                "countryCount": {
                  "type": "integer",
                  "description": "Countries."
                },
                "chartCount": {
                  "type": "integer",
                  "description": "Charts the apps appear on."
                },
                "attentionScore": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Combined rank and rating momentum."
                },
                "rankVelocity7d": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Rank change per day over 7 days."
                },
                "ratingChange7d": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Rating change in 7 days."
                },
                "ratingCountGrowth7d": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Growth in ratings over 7 days."
                },
                "comparableSeries7d": {
                  "type": "integer",
                  "description": "Series with a read 7 days earlier."
                },
                "observedAt": {
                  "type": "string",
                  "format": "date-time",
                  "description": "When it was read."
                }
              }
            }
          },
          "description": "Companies by attention score."
        },
        "peers": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "description": "Peer companies."
        },
        "countries": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "description": "Attention by country."
        },
        "history": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "description": "Attention by day."
        },
        "spreads": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "description": "Apps ranked far apart across countries."
        },
        "evidence": {
          "type": "object",
          "additionalProperties": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "description": "The chart reads behind the result."
        },
        "coverage": {
          "type": "object",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "configuredCountries": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Countries read."
              },
              "observedCountries": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Countries with data."
              },
              "availableCharts": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Charts read."
              },
              "categories": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Categories read."
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Each source and when it was read."
              },
              "limitations": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "What the data cannot show."
              },
              "historyDays": {
                "type": "integer",
                "description": "Days of history."
              },
              "staleAfterHours": {
                "type": "integer",
                "description": "Hours before a chart is stale."
              }
            }
          },
          "description": "Countries, charts and sources covered, with limitations."
        }
      }
    },
    "meta": {
      "$ref": "#/$defs/Meta"
    }
  },
  "$defs": {
    "CompanyAppRank": {
      "type": "object",
      "description": "One of the company's apps on a store chart.",
      "properties": {
        "appId": {
          "type": "string",
          "description": "Store app id."
        },
        "name": {
          "type": "string",
          "description": "Name."
        },
        "developer": {
          "type": "string",
          "description": "Developer."
        },
        "developerId": {
          "type": [
            "string",
            "null"
          ],
          "description": "Developer id."
        },
        "appUrl": {
          "type": "string",
          "format": "uri",
          "description": "Store page."
        },
        "genres": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Store genres."
        },
        "genreIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Store genre ids."
        },
        "rank": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Chart rank."
        },
        "rating": {
          "type": [
            "number",
            "null"
          ],
          "description": "Average rating, 1 to 5."
        },
        "ratingCount": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Ratings."
        },
        "reviewCount": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Reviews."
        },
        "ratingObservedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When the rating was read."
        },
        "ratingSourceUrl": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri",
          "description": "Rating source."
        },
        "exchange": {
          "type": [
            "string",
            "null"
          ],
          "description": "Exchange."
        },
        "entityId": {
          "type": [
            "string",
            "null"
          ],
          "description": "Entity id."
        },
        "parentEntityId": {
          "type": [
            "string",
            "null"
          ],
          "description": "Parent company entity id."
        },
        "confidence": {
          "type": "number",
          "description": "Mapping confidence, 0 to 1."
        },
        "mappingSourceUrl": {
          "type": [
            "string",
            "null"
          ],
          "format": "uri",
          "description": "Careers source the listing maps to."
        },
        "mappingRevisionId": {
          "type": [
            "string",
            "null"
          ],
          "description": "Mapping revision."
        },
        "current": {
          "type": "boolean",
          "description": "True for the newest chart read."
        },
        "sourceId": {
          "type": "string",
          "description": "Chart: store, country, chart, category."
        },
        "store": {
          "type": "string",
          "enum": [
            "app-store",
            "google-play",
            "myapp"
          ],
          "description": "app-store, google-play or myapp."
        },
        "country": {
          "type": "string",
          "description": "Country code."
        },
        "chart": {
          "type": "string",
          "enum": [
            "free",
            "paid",
            "grossing",
            "unranked"
          ],
          "description": "Chart."
        },
        "category": {
          "type": "string",
          "description": "Chart category."
        },
        "chartLimit": {
          "type": "integer",
          "description": "Length of the chart."
        },
        "sourceUrl": {
          "type": "string",
          "format": "uri",
          "description": "Where the source publishes it."
        },
        "sourceUpdatedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When the source last updated."
        },
        "observedAt": {
          "type": "string",
          "format": "date-time",
          "description": "When it was read."
        },
        "publishedAt": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "When the store published the chart: sourceUpdatedAt, null where it does not say."
        },
        "revisionId": {
          "type": "string",
          "description": "Revision id."
        },
        "supersedesRevisionId": {
          "type": [
            "string",
            "null"
          ],
          "description": "The revision it replaces."
        },
        "rankChange1d": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Places gained in a day; positive is up."
        },
        "rankChange7d": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Places gained in 7 days."
        },
        "rankVelocity7d": {
          "type": [
            "number",
            "null"
          ],
          "description": "Rank change per day over 7 days."
        },
        "ratingChange7d": {
          "type": [
            "number",
            "null"
          ],
          "description": "Rating change in 7 days."
        },
        "ratingCountGrowth7d": {
          "type": [
            "number",
            "null"
          ],
          "description": "Growth in ratings over 7 days."
        },
        "reviewGrowth7d": {
          "type": [
            "number",
            "null"
          ],
          "description": "Growth in reviews over 7 days."
        },
        "stale": {
          "type": "boolean",
          "description": "True when the source has not updated on schedule."
        }
      },
      "required": [
        "appId",
        "name",
        "developer",
        "developerId",
        "appUrl",
        "genres",
        "genreIds",
        "rank",
        "rating",
        "ratingCount",
        "reviewCount",
        "ratingObservedAt",
        "ratingSourceUrl",
        "exchange",
        "entityId",
        "parentEntityId",
        "confidence",
        "mappingSourceUrl",
        "mappingRevisionId",
        "current",
        "sourceId",
        "store",
        "country",
        "chart",
        "category",
        "chartLimit",
        "sourceUrl",
        "sourceUpdatedAt",
        "observedAt",
        "publishedAt",
        "revisionId",
        "supersedesRevisionId",
        "rankChange1d",
        "rankChange7d",
        "rankVelocity7d",
        "ratingChange7d",
        "ratingCountGrowth7d",
        "reviewGrowth7d",
        "stale"
      ]
    },
    "Listed": {
      "type": "object",
      "description": "The listing a row is about.",
      "properties": {
        "symbol": {
          "type": "string",
          "description": "The listing this row is about, as meta.symbols names it."
        }
      },
      "required": [
        "symbol"
      ]
    },
    "Meta": {
      "type": "object",
      "required": [
        "dataset",
        "requestId",
        "asOf",
        "dataThrough",
        "historyStart",
        "updatedAt",
        "page",
        "next",
        "coverage",
        "source",
        "notices",
        "symbols"
      ],
      "properties": {
        "dataset": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "gpu",
            "hiring-jobs",
            "hiring-momentum",
            "app-attention",
            "awards",
            "kpis-guidance",
            "credit-documents",
            "power",
            "perps",
            "catalysts",
            "supply-chain",
            "exposure",
            "transcripts",
            "exec-pay",
            "risk-factors",
            "events",
            "document-search",
            "news",
            "social-mentions",
            "cpi",
            "energy-inventories",
            "cot",
            "short-volume",
            "short-interest",
            "sec",
            "congress",
            "macro",
            "central-bank-rates",
            "cds",
            "debt-maturities",
            "revenue-breakdown",
            "depositary-receipts",
            "bond-trades",
            "market-data",
            "futures",
            "rate-path",
            "options",
            "earnings",
            "ipo",
            "mna",
            "equity-screener",
            "crypto",
            "session-tape",
            "analyst-estimates",
            null
          ]
        },
        "requestId": {
          "type": "string",
          "description": "Quote it to support."
        },
        "asOf": {
          "type": [
            "string",
            "null"
          ],
          "description": "The point in time you asked for with asOf, or null for the latest."
        },
        "dataThrough": {
          "type": [
            "string",
            "null"
          ],
          "description": "The newest date or time the data covers."
        },
        "historyStart": {
          "type": [
            "string",
            "null"
          ],
          "description": "Earliest date the dataset has history for, when known; otherwise null."
        },
        "updatedAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "When the data last changed, when known."
        },
        "page": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "required": [
                "limit",
                "hasMore",
                "nextCursor",
                "total"
              ],
              "properties": {
                "limit": {
                  "type": "integer",
                  "minimum": 1
                },
                "hasMore": {
                  "type": "boolean"
                },
                "nextCursor": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "total": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0,
                  "description": "Rows that match the query on every page, where the route counts them; null where it does not."
                }
              }
            }
          ],
          "description": "Paging of a list; null for a single record."
        },
        "next": {
          "type": [
            "string",
            "null"
          ],
          "description": "The next page as a ready URL, or null."
        },
        "coverage": {
          "description": "Service-established coverage; null when unavailable."
        },
        "source": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "attribution",
              "licence"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "attribution": {
                "type": "string"
              },
              "licence": {
                "type": "string"
              }
            }
          }
        },
        "delayed": {
          "type": "boolean",
          "const": true,
          "description": "Present, and true, only on market prices that follow delayed-data access."
        },
        "notices": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/Notice"
          },
          "description": "Caveats that change how to read the data: disclaimers, gaps, illustrative samples."
        },
        "sampledAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Only on sample routes: when the sample was read from the dataset. Null for the built-in example, served until the first daily read succeeds."
        },
        "symbols": {
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/$defs/SymbolResult"
              }
            }
          ],
          "description": "Each listing a symbols= call named, in the order sent: as sent, its canonical listing and whether it was read. Only ok listings are charged. Null when the call named none."
        },
        "cursor": {
          "type": [
            "string",
            "null"
          ],
          "description": "Only on a change feed (/v1/catalysts/changes, /v1/insider-trades/changes): the cursor to send as cursor on the next poll, with the same since and symbols. It is there caught up too, when meta.next is null. One cursor serves all the symbols of the call: on /v1/catalysts/changes it is the earliest of the listings', each of which is also in meta.symbols."
        },
        "checkedAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Only on a change feed (/v1/catalysts/changes, /v1/insider-trades/changes): when its collector last finished reading its sources, rows or none, so a quiet feed reads apart from a stalled one; on /v1/catalysts/changes the newest of its sources' last reads. It is in no ETag, and the X-Checked-At header carries it on a 304 too. Null when not recorded."
        },
        "pointInTime": {
          "type": "object",
          "required": [
            "cutoff",
            "basis",
            "versions"
          ],
          "properties": {
            "cutoff": {
              "type": "string",
              "format": "date-time",
              "description": "The last moment the read counts, in UTC: a date's is the end of that day."
            },
            "basis": {
              "type": "string",
              "enum": [
                "observedAt",
                "publishedAt"
              ],
              "description": "observedAt: the rows Gloom had stored by the cutoff. publishedAt: the route does not record when Gloom stored each row, so the rows are those their source had published by then."
            },
            "versions": {
              "type": "string",
              "enum": [
                "kept",
                "unchanged",
                "latest"
              ],
              "description": "kept: each row has the values it had then. unchanged: so does each row, and a row changed since is left out. latest: each row has its values now, which may hold a revision made after the cutoff."
            }
          },
          "description": "Only on a call that sent asOf: what the answer is. Unless basis is observedAt and versions kept, a point_in_time notice says what the route cannot give."
        }
      }
    },
    "Notice": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "SymbolResult": {
      "type": "object",
      "required": [
        "input",
        "symbol",
        "status"
      ],
      "properties": {
        "input": {
          "type": "string",
          "description": "As sent."
        },
        "symbol": {
          "type": [
            "string",
            "null"
          ],
          "description": "The canonical listing: the bare symbol on a US venue (BRK.B), else SYMBOL:MIC (AIR:XPAR). Null when the notation names no listing."
        },
        "status": {
          "type": "string",
          "enum": [
            "ok",
            "empty",
            "not_found",
            "unavailable",
            "partial"
          ],
          "description": "ok: read and charged. empty: a listing Gloom knows that the dataset holds nothing for here, or does not cover (an outside_coverage notice names those); free. not_found: no listing Gloom knows; free. unavailable: it could not be read now; free, retry later. partial: read in part, free, send it again."
        },
        "cursor": {
          "type": [
            "string",
            "null"
          ],
          "description": "Only on a route that pages by its own cursor: where this listing reads on. Send it as cursor with symbols= naming this listing alone. On a change feed it is there caught up too. Null when the listing has no more, or was not read."
        }
      }
    }
  }
}