generated: '2026-09-20' method: derived generator: derive-data-model.py source: - openapi/perigon-openapi.yml notation: has_one = property $ref; has_many = array of $ref; belongs_to = _id field summary: entities: 122 entities_in_spec: 122 relationships: 162 entities: - name: ApiKeyStatus fields: 5 description: Validity and status of a single API key. - name: ApiLimitsDto fields: 11 description: 'Current API usage and limits for the authenticated account, optionally including the status of additional API keys that were requested. Reading this does not count against the account''s request quota ' - name: Article fields: 45 - name: ArticleRefreshData fields: 22 - name: ArticleRefreshJobArticleResult fields: 4 - name: ArticleRefreshJobResponse fields: 3 - name: ArticleRefreshPeekResponse fields: 1 - name: ArticleRefreshPeekResult fields: 3 - name: ArticleRefreshSubmitRequest fields: 1 - name: ArticleSearchFilter fields: 43 description: Complex filter structure for article searches that supports nested logical operations (AND, OR, NOT) and multiple filtering criteria. - name: ArticleSearchParams fields: 7 - name: ArticlesVectorSearchResult fields: 2 description: Articles vector search result - name: CategoryHolder fields: 1 description: Google Content Categories most strongly associated with the story. - name: CategoryWithScoreHolder fields: 2 description: Google Content Categories assigned to the article with confidence scores. - name: Company fields: 33 - name: CompanyCount fields: 5 description: Companies associated with the story and their article counts. - name: CompanyHolder fields: 4 description: Companies most strongly associated with the story. - name: CompanySearchResult fields: 3 description: Company search result - name: ComplexAllEndpointQuery fields: 89 description: Article search filters that determine which content the monitor evaluates. - name: ContactPointApiDto fields: 11 description: Contact point used to deliver monitor notifications. - name: ContactPointListResult fields: 2 description: Paginated list of contact points. - name: ContactPointRequestBody fields: 4 - name: ContactPointResult fields: 1 description: Single contact point response. - name: ContactPointUpdateBody fields: 3 - name: Coordinate fields: 2 description: Geographic coordinates of the place. - name: CoordinateFilter fields: 3 description: Filter articles from publishers based at specific geographic locations. Uses latitude, longitude, and radius parameters to define a circular search area for publisher locations. - name: CreateSourceGroupParams fields: 4 - name: CreateWatchlistParams fields: 6 - name: EntityGroup fields: 2 description: Entity groups the monitor identifies in matching content. - name: EntityHolder fields: 3 description: Named entities extracted from the article. - name: ErrorResponse fields: 3 - name: EventTypeHolder fields: 2 description: Event types detected in the article. - name: FillbotMetadata fields: 1 description: Provenance for event fields populated by the enrichment process. - name: FilledField fields: 4 description: Event fields populated by enrichment and the sources used for each field. - name: IdNameHolder fields: 2 description: Known journalist records matched to the article byline. - name: ImageHolder fields: 1 - name: Journalist fields: 28 description: Expanded journalist details, when requested and available. - name: JournalistSearchResult fields: 3 description: Journalist search result - name: KeyPoint fields: 2 description: Key facts and developments identified in the story. - name: KeywordHolder fields: 2 description: Keywords extracted from the article with their relevance weights. - name: LabelHolder fields: 1 description: Editorial labels assigned to the article. - name: LimitsResult fields: 1 description: API usage and limits response. - name: LocationCount fields: 6 description: Locations associated with the story and their article counts. - name: LocationHolder fields: 5 description: Locations most strongly associated with the story. - name: MatchedEntityData fields: 3 description: Entities matched in the content that produced the event. - name: MonitorEventListResult fields: 2 description: Paginated list of monitor events. - name: MonitorListResult fields: 2 description: Paginated list of monitors. - name: MonitorNewsletterListResult fields: 2 description: Paginated list of monitor newsletters. - name: MonitorResult fields: 1 description: Single monitor response. - name: MonitorSummaryListResult fields: 2 description: Paginated list of monitor summaries. - name: NameCount fields: 2 description: Countries most frequently associated with the journalist's articles. - name: NewsCluster fields: 36 description: Expanded story cluster details, when requested and available. - name: PatchSourceGroupParams fields: 4 - name: PeopleSearchResult fields: 3 description: Person search result - name: Person fields: 14 - name: PersonCount fields: 3 description: People associated with the story and their article counts. - name: PersonHolder fields: 2 description: People most strongly associated with the story. - name: Place fields: 15 description: Structured geographic places extracted from the article. - name: QuerySearchResult fields: 3 - name: Question fields: 3 description: Questions and answers generated from the story content. - name: RecordStatHolder fields: 2 description: Google Content Categories associated with the story and their article counts. - name: ScheduleInterval fields: 5 description: Times when the monitor runs. Must contain between 1 and 24 intervals. - name: ScoredDataArticle fields: 3 - name: ScoredDataWikiData fields: 3 - name: SentimentHolder fields: 3 description: Aggregate sentiment scores for the story. - name: SignalApiCreateBody fields: 13 - name: SignalApiDto fields: 16 description: Monitor payload. - name: SignalApiUpdateBody fields: 12 - name: SignalArticlePartialDto fields: 6 description: Article details keyed by article ID for articles related to the event. - name: SignalEventDto fields: 16 description: Events returned for the requested page. - name: SignalMonitoringPlanDataSchema fields: 3 description: Schema for the structured data extracted into each matching event. - name: SignalMonitoringPlanDataSchemaProperty fields: 4 description: Structured event field definitions keyed by output field name. - name: SignalMonitoringPlanNewsletterConfig fields: 2 description: Citation settings for newsletters generated by the monitor. - name: SignalNewsletterDto fields: 8 description: Newsletters returned for the requested page. - name: SignalNewsletterStoryPartialDto fields: 6 description: Story details keyed by story identifier for stories cited in the newsletter. - name: SignalSchedulePolicy fields: 2 description: Recurring processing schedule configured for the monitor. - name: SignalSummaryDto fields: 3 description: Summaries returned for the requested page. - name: SignalXQuery fields: 3 - name: Source fields: 3 description: Sources used to populate the field. - name: SourceGroupDto fields: 9 description: Named group of news source domains for filtering search and monitors. - name: SourceGroupListResult fields: 2 description: Paginated list of source groups. - name: SourceGroupResolveResult fields: 1 description: Resolved source groups response. - name: SourceGroupResult fields: 1 description: Single source group response. - name: SourceHolder fields: 3 description: Publisher information for the selected story image. - name: SourceLocation fields: 5 description: Geographic location of the publisher, when available. - name: SourceSearchResult fields: 3 description: Source search result - name: StatResult fields: 3 - name: StoryHistoryRecord fields: 9 description: History records returned for the requested page. - name: StoryHistoryResult fields: 3 description: Story history result - name: StorySearchResult fields: 3 description: Story search result - name: SummaryBody fields: 9 description: Request body for the Search-Summarizer endpoint. Contains the user’s summary instructions, how many articles to include, which fields to use, the retrieval method, and LLM generation settings. - name: SummarySearchResult fields: 4 - name: SymbolHolder fields: 6 - name: TopicDto fields: 5 - name: TopicHolder fields: 1 description: Topics most strongly associated with the story. - name: TopicLabels fields: 2 - name: TopicSearchResult fields: 2 description: Topic search result - name: UpdateWatchlistParams fields: 6 - name: VectorData fields: 2 description: Vector embeddings associated with the article, when requested. - name: WatchlistCompany fields: 6 description: Updated list of companies to include in the watchlist - name: WatchlistCompanyDto fields: 6 description: Companies included in the watchlist. - name: WatchlistDto fields: 10 description: Watchlist of people and companies for use with monitors. - name: WatchlistListResult fields: 2 description: Paginated list of watchlists. - name: WatchlistPerson fields: 5 description: Updated list of people to include in the watchlist - name: WatchlistPersonDto fields: 5 description: People included in the watchlist. - name: WatchlistResolveResult fields: 1 description: Resolved watchlists response. - name: WatchlistResult fields: 1 description: Single watchlist response. - name: WebResources fields: 17 - name: WikiData fields: 15 - name: WikiPage fields: 19 - name: WikiPageSectionHolder fields: 6 - name: WikidataDateHolder fields: 2 - name: WikidataLabelHolder fields: 2 - name: WikidataPoliticalPartyHolder fields: 4 - name: WikidataPositionHolder fields: 5 - name: WikipediaSearchFilter fields: 12 description: Complex filter structure for Wikipedia page searches that supports nested logical operations (AND, OR, NOT) and multiple filtering criteria. - name: WikipediaSearchParams fields: 8 - name: WikipediaSearchResult fields: 3 description: Wikipedia search result - name: WikipediaVectorSearchResult fields: 2 description: Wikipedia vector search result - name: XPost fields: 12 - name: XPostMedia fields: 2 - name: XPostMediaItem fields: 1 relationships: - from: UpdateWatchlistParams to: WatchlistPerson type: has_many via: people - from: UpdateWatchlistParams to: WatchlistCompany type: has_many via: companies - from: WatchlistPerson to: WikiData type: belongs_to via: wikidataId - from: WatchlistDto to: WatchlistPersonDto type: has_many via: people - from: WatchlistDto to: WatchlistCompanyDto type: has_many via: companies - from: WatchlistPersonDto to: WikiData type: belongs_to via: wikidataId - from: CreateWatchlistParams to: WatchlistPerson type: has_many via: people - from: CreateWatchlistParams to: WatchlistCompany type: has_many via: companies - from: WikipediaSearchFilter to: WikiPage type: belongs_to via: wikiPageId - from: WikipediaSearchFilter to: WikiData type: belongs_to via: wikidataId - from: WikipediaSearchParams to: WikipediaSearchFilter type: has_one via: filter - from: ScoredDataWikiData to: WikiData type: has_one via: data - from: ScoredDataWikiData to: VectorData type: has_many via: vectors - from: WikiData to: WikiPage type: belongs_to via: wikiPageId - from: WikiData to: WikidataLabelHolder type: has_many via: wikidataInstanceOf - from: WikidataLabelHolder to: WikiData type: belongs_to via: wikidataId - from: WikipediaVectorSearchResult to: ScoredDataWikiData type: has_many via: results - from: ArticleSearchFilter to: Article type: belongs_to via: articleId - from: ArticleSearchFilter to: CoordinateFilter type: has_one via: coordinates - from: ArticleSearchFilter to: CoordinateFilter type: has_one via: sourceCoordinates - from: ArticleSearchFilter to: Company type: belongs_to via: companyId - from: ArticleSearchParams to: ArticleSearchFilter type: has_one via: filter - from: Article to: SourceHolder type: has_one via: source - from: Article to: LabelHolder type: has_many via: labels - from: Article to: EventTypeHolder type: has_many via: eventTypes - from: Article to: IdNameHolder type: has_many via: matchedAuthors - from: Article to: KeywordHolder type: has_many via: keywords - from: Article to: TopicHolder type: has_many via: topics - from: Article to: CategoryHolder type: has_many via: categories - from: Article to: CategoryWithScoreHolder type: has_many via: taxonomies - from: Article to: EntityHolder type: has_many via: entities - from: Article to: CompanyHolder type: has_many via: companies - from: Article to: SentimentHolder type: has_one via: sentiment - from: Article to: LocationHolder type: has_many via: locations - from: Article to: Place type: has_many via: places - from: Article to: PersonHolder type: has_many via: people - from: Article to: NewsCluster type: has_one via: cluster - from: Article to: Journalist type: has_many via: journalists - from: Article to: VectorData type: has_many via: vectors - from: ArticlesVectorSearchResult to: ScoredDataArticle type: has_many via: results - from: PersonHolder to: WikiData type: belongs_to via: wikidataId - from: Place to: Coordinate type: has_one via: coordinates - from: ScoredDataArticle to: Article type: has_one via: data - from: ScoredDataArticle to: VectorData type: has_many via: vectors - from: SourceHolder to: SourceLocation type: has_one via: location - from: SourceLocation to: Coordinate type: has_one via: coordinates - from: Journalist to: LocationHolder type: has_many via: locations - from: Journalist to: NameCount type: has_many via: topTopics - from: Journalist to: NameCount type: has_many via: topSources - from: Journalist to: NameCount type: has_many via: topCategories - from: Journalist to: NameCount type: has_many via: topLabels - from: Journalist to: NameCount type: has_many via: topCountries - from: NewsCluster to: SourceHolder type: has_one via: imageSource - from: NewsCluster to: KeyPoint type: has_many via: keyPoints - from: NewsCluster to: Question type: has_many via: questions - from: NewsCluster to: Article type: has_many via: selectedArticles - from: NewsCluster to: SentimentHolder type: has_one via: sentiment - from: NewsCluster to: RecordStatHolder type: has_many via: countries - from: NewsCluster to: RecordStatHolder type: has_many via: topics - from: NewsCluster to: TopicHolder type: has_many via: topTopics - from: NewsCluster to: RecordStatHolder type: has_many via: categories - from: NewsCluster to: CategoryHolder type: has_many via: topCategories - from: NewsCluster to: RecordStatHolder type: has_many via: taxonomies - from: NewsCluster to: CategoryHolder type: has_many via: topTaxonomies - from: NewsCluster to: PersonCount type: has_many via: people - from: NewsCluster to: PersonHolder type: has_many via: topPeople - from: NewsCluster to: CompanyCount type: has_many via: companies - from: NewsCluster to: CompanyHolder type: has_many via: topCompanies - from: NewsCluster to: LocationCount type: has_many via: locations - from: NewsCluster to: LocationHolder type: has_many via: topLocations - from: PersonCount to: WikiData type: belongs_to via: wikidataId - from: SummarySearchResult to: Article type: has_many via: results - from: ArticleRefreshSubmitRequest to: Article type: belongs_to via: articleIds - from: ArticleRefreshData to: Article type: belongs_to via: articleId - from: ArticleRefreshData to: SourceHolder type: has_one via: source - from: ArticleRefreshData to: EntityHolder type: has_many via: entities - from: ArticleRefreshData to: PersonHolder type: has_many via: people - from: ArticleRefreshData to: CompanyHolder type: has_many via: companies - from: ArticleRefreshData to: IdNameHolder type: has_many via: matchedAuthors - from: ArticleRefreshPeekResponse to: ArticleRefreshPeekResult type: has_many via: results - from: ArticleRefreshPeekResult to: ArticleRefreshData type: has_one via: data - from: ArticleRefreshJobArticleResult to: Article type: belongs_to via: articleId - from: ArticleRefreshJobArticleResult to: ArticleRefreshData type: has_one via: data - from: ArticleRefreshJobResponse to: ArticleRefreshJobArticleResult type: has_many via: results - from: WatchlistResult to: WatchlistDto type: has_one via: data - from: SourceGroupResult to: SourceGroupDto type: has_one via: data - from: ComplexAllEndpointQuery to: Article type: belongs_to via: articleId - from: ComplexAllEndpointQuery to: Journalist type: belongs_to via: journalistId - from: ComplexAllEndpointQuery to: Company type: belongs_to via: companyId - from: SignalApiCreateBody to: SignalMonitoringPlanDataSchema type: has_one via: dataSchema - from: SignalApiCreateBody to: SignalMonitoringPlanNewsletterConfig type: has_one via: newsletterConfig - from: SignalApiCreateBody to: EntityGroup type: has_many via: entityGroups - from: SignalApiCreateBody to: ComplexAllEndpointQuery type: has_one via: query - from: SignalApiCreateBody to: SignalSchedulePolicy type: has_one via: schedulePolicy - from: SignalApiCreateBody to: SignalXQuery type: has_one via: xQuery - from: SignalSchedulePolicy to: ScheduleInterval type: has_many via: intervals - from: MonitorResult to: SignalApiDto type: has_one via: data - from: SignalApiDto to: SignalMonitoringPlanDataSchema type: has_one via: dataSchema - from: SignalApiDto to: SignalMonitoringPlanNewsletterConfig type: has_one via: newsletterConfig - from: SignalApiDto to: EntityGroup type: has_many via: entityGroups - from: SignalApiDto to: ComplexAllEndpointQuery type: has_one via: query - from: SignalApiDto to: SignalSchedulePolicy type: has_one via: schedulePolicy - from: SignalApiDto to: SignalXQuery type: has_one via: xQuery - from: ContactPointResult to: ContactPointApiDto type: has_one via: data - from: QuerySearchResult to: Article type: has_many via: articles - from: SignalApiUpdateBody to: SignalMonitoringPlanDataSchema type: has_one via: dataSchema - from: SignalApiUpdateBody to: SignalMonitoringPlanNewsletterConfig type: has_one via: newsletterConfig - from: SignalApiUpdateBody to: EntityGroup type: has_many via: entityGroups - from: SignalApiUpdateBody to: ComplexAllEndpointQuery type: has_one via: query - from: SignalApiUpdateBody to: SignalSchedulePolicy type: has_one via: schedulePolicy - from: SignalApiUpdateBody to: SignalXQuery type: has_one via: xQuery - from: WikiPage to: WikiData type: belongs_to via: wikidataId - from: WikiPage to: WikidataLabelHolder type: has_many via: wikidataInstanceOf - from: WikiPage to: WikiPageSectionHolder type: has_many via: sections - from: WikipediaSearchResult to: WikiPage type: has_many via: results - from: TopicDto to: TopicLabels type: has_one via: labels - from: TopicSearchResult to: TopicDto type: has_many via: data - from: StoryHistoryRecord to: KeyPoint type: has_many via: keyPoints - from: StoryHistoryRecord to: Question type: has_many via: questions - from: StoryHistoryResult to: StoryHistoryRecord type: has_many via: results - from: StorySearchResult to: NewsCluster type: has_many via: results - from: Company to: SymbolHolder type: has_many via: symbols - from: Company to: WebResources type: has_one via: webResources - from: Person to: WikiData type: belongs_to via: wikidataId - from: Person to: WikidataLabelHolder type: has_one via: gender - from: Person to: WikidataDateHolder type: has_one via: dateOfBirth - from: Person to: WikidataDateHolder type: has_one via: dateOfDeath - from: Person to: WikidataLabelHolder type: has_many via: occupation - from: Person to: WikidataPositionHolder type: has_many via: position - from: Person to: WikidataPoliticalPartyHolder type: has_many via: politicalParty - from: Person to: ImageHolder type: has_one via: image - from: WikidataPoliticalPartyHolder to: WikiData type: belongs_to via: wikidataId - from: WikidataPoliticalPartyHolder to: WikidataDateHolder type: has_one via: startTime - from: WikidataPoliticalPartyHolder to: WikidataDateHolder type: has_one via: endTime - from: WikidataPositionHolder to: WikiData type: belongs_to via: wikidataId - from: WikidataPositionHolder to: WikidataDateHolder type: has_one via: startTime - from: WikidataPositionHolder to: WikidataDateHolder type: has_one via: endTime - from: WikidataPositionHolder to: WikidataLabelHolder type: has_one via: employer - from: Source to: Article type: belongs_to via: articleId - from: SourceSearchResult to: Source type: has_many via: results - from: PeopleSearchResult to: Person type: has_many via: results - from: ApiLimitsDto to: ApiKeyStatus type: has_many via: keyStatuses - from: LimitsResult to: ApiLimitsDto type: has_one via: data - from: JournalistSearchResult to: Journalist type: has_many via: results - from: CompanySearchResult to: Company type: has_many via: results - from: WatchlistListResult to: WatchlistDto type: has_many via: data - from: WatchlistResolveResult to: WatchlistDto type: has_many via: data - from: SourceGroupListResult to: SourceGroupDto type: has_many via: data - from: SourceGroupResolveResult to: SourceGroupDto type: has_many via: data - from: MonitorListResult to: SignalApiDto type: has_many via: data - from: MonitorSummaryListResult to: SignalSummaryDto type: has_many via: data - from: MonitorNewsletterListResult to: SignalNewsletterDto type: has_many via: data - from: XPost to: XPostMedia type: has_one via: media - from: XPostMedia to: XPostMediaItem type: has_many via: photo - from: XPostMedia to: XPostMediaItem type: has_many via: video - from: FillbotMetadata to: FilledField type: has_many via: filledFields - from: FilledField to: Source type: has_many via: sources - from: MonitorEventListResult to: SignalEventDto type: has_many via: data - from: SignalEventDto to: MatchedEntityData type: has_many via: entities - from: SignalEventDto to: FillbotMetadata type: has_one via: fillbotMetadata - from: SignalEventDto to: XPost type: has_many via: xPosts - from: ContactPointListResult to: ContactPointApiDto type: has_many via: data