name: Impact Data Model description: Entity-relationship graph derived from the $ref links and *Id reference fields in the 69 published impact.com OpenAPI documents (Brand v14, Partner v16, Agency v3, Advocate v13). generated: '2026-08-13' method: derived source: openapi/impact-*-openapi.yml entity_count: 185 entities_with_relationships: 79 core_entities: - name: Campaign aliases: - Program description: A brand partnership program. The organizing entity almost everything else belongs to. The API path segment is Campaigns while the docs and newer fields say Programs. - name: MediaPartner aliases: - Partner - Publisher description: An affiliate, creator or media partner enrolled in one or more campaigns. - name: Contract description: The signed agreement between a brand and a partner, carrying the commission terms. - name: Action description: A tracked conversion event credited to a partner and eligible for payout. - name: ActionUpdate description: A change to a previously reported action - approval, reversal, amount modification. - name: Click description: A tracked partner click, exported in bulk via ClickExport. - name: Ad description: A creative unit a partner promotes; carries the tracking link. - name: Deal description: A discount or offer partners can promote, scoped to a product, category or the whole store. - name: PromoCode description: A promotional code attached to a campaign or deal. - name: Catalog description: A brand product feed shared with partners; contains CatalogItems. - name: Invoice description: A recipient-generated invoice covering partner payouts. - name: Job description: An asynchronous export or bulk operation; the deferred-response pattern. - name: Report description: A named report template that is run with parameters and exported. relationships: - from: Account type: has_one to: AccountReferral via: referral - from: Account type: has_one to: AccountSubscription via: subscription - from: Action type: belongs_to to: Ad via: AdId - from: Action type: belongs_to to: Campaign via: CampaignId - from: Action type: belongs_to to: MediaPartner via: MediaPartnerId - from: Action type: has_one to: ActionState via: State - from: ActionInquiry type: belongs_to to: Action via: ActionId - from: ActionInquiry type: belongs_to to: Campaign via: CampaignId - from: ActionInquiry type: belongs_to to: MediaPartner via: MediaPartnerId - from: ActionInquiry type: has_many to: Comment via: Comments - from: ActionInquiry type: has_one to: InquiryType via: InquiryType - from: ActionInquiry type: has_one to: RejectReason via: RejectReason - from: ActionInquiry type: has_one to: ResolutionStatus via: ResolutionStatus - from: ActionModificationRequest type: belongs_to to: Action via: ActionId - from: ActionReversalRequest type: belongs_to to: Action via: ActionId - from: ActionUpdate type: belongs_to to: Action via: ActionId - from: ActionUpdate type: belongs_to to: Ad via: AdId - from: ActionUpdate type: belongs_to to: Campaign via: CampaignId - from: ActionUpdate type: belongs_to to: Contract via: ContractId - from: ActionUpdate type: belongs_to to: MediaPartner via: MediaPartnerId - from: ActionUpdate type: has_one to: ActionState via: State - from: Ad type: belongs_to to: Campaign via: CampaignId - from: Ad type: belongs_to to: Deal via: DealId - from: AdCreateUpdate type: belongs_to to: Campaign via: CampaignId - from: AdCreateUpdate type: belongs_to to: Deal via: DealId - from: ApiSubmission type: belongs_to to: Account via: AccountId - from: ApiSubmission type: belongs_to to: Campaign via: CampaignId - from: ApiSubmission type: belongs_to to: MediaPartner via: MediaPartnerId - from: CallDataPayload type: belongs_to to: Ad via: AdId - from: CallDataPayload type: belongs_to to: Campaign via: CampaignId - from: CampaignTerm type: has_many to: CampaignTermEventPayout via: EventPayouts - from: CampaignTerm type: has_many to: EventPayout via: EventPayouts - from: CampaignTermEventPayout type: has_many to: PayoutGroup via: PayoutGroups - from: Catalog type: belongs_to to: Campaign via: CampaignId - from: CatalogItem type: belongs_to to: Campaign via: CampaignId - from: CatalogItem type: belongs_to to: Catalog via: CatalogId - from: Click type: belongs_to to: Ad via: AdId - from: Click type: belongs_to to: Campaign via: CampaignId - from: Code type: has_one to: RewardTemplate via: reward - from: CodeClassicReward type: has_one to: ClassicRewardTemplate via: reward - from: Comment type: has_many to: Attachment via: Attachments - from: CompanyInformation type: has_one to: Address via: BillingAddress - from: CompanyInformation type: has_one to: Address via: CorporateAddress - from: CompanyInformation type: has_one to: Address via: ShippingAddress - from: CompanyInformation type: has_one to: Contact via: CommercialContact - from: CompanyInformation type: has_one to: Contact via: FinancialContact - from: CompanyInformation type: has_one to: Contact via: SecurityContact - from: CompanyInformation type: has_one to: Contact via: TechnicalContact - from: CompanyInformation type: has_one to: Education via: Education - from: CompanyInformation type: has_one to: Ethnicity via: Ethnicity - from: CompanyInformation type: has_one to: Gender via: Gender - from: CompanyInformation type: has_one to: HouseholdIncome via: HouseholdIncome - from: CompanyInformation type: has_one to: Industry via: Industry - from: CompanyInformation type: has_one to: OrganizationType via: OrganizationType - from: CompanyInformation type: has_one to: ParentalStatus via: ParentalStatus - from: CompanyInformation type: has_one to: PromotionalMethod via: PrimaryPromotionalMethod - from: CompanyInformation type: has_one to: Pronouns via: Pronouns - from: CompanyInformation type: has_one to: RelationshipStatus via: RelationshipStatus - from: CompanyInformationUpdate type: has_one to: Address via: BillingAddress - from: CompanyInformationUpdate type: has_one to: Address via: CorporateAddress - from: CompanyInformationUpdate type: has_one to: Contact via: CommercialContact - from: CompanyInformationUpdate type: has_one to: Contact via: FinancialContact - from: CompanyInformationUpdate type: has_one to: Contact via: SecurityContact - from: CompanyInformationUpdate type: has_one to: Contact via: TechnicalContact - from: CompanyInformationUpdate type: has_one to: OrganizationType via: OrganizationType - from: ComplianceContent type: belongs_to to: Campaign via: CampaignId - from: ComplianceContent type: belongs_to to: Partner via: PartnerId - from: ComplianceContent type: has_many to: Keyword via: Keywords - from: ComplianceSubmissionRequest type: has_many to: ComplianceContent via: Contents - from: Contact type: belongs_to to: User via: UserId - from: Contract type: belongs_to to: Campaign via: CampaignId - from: Contract type: belongs_to to: Partner via: PartnerId - from: Contract type: has_many to: CampaignTerm via: CampaignTerms - from: Contract type: has_many to: ScheduledTerm via: ScheduledTerms - from: Contract type: has_one to: TemplateTerms via: TemplateTerms - from: Contract type: has_one to: Terms via: Terms - from: ConversionPayload type: belongs_to to: Campaign via: CampaignId - from: ConversionPayload type: belongs_to to: MediaPartner via: MediaPartnerId - from: ConversionPayload type: has_one to: ConversionType via: ConversionType - from: Deal type: belongs_to to: Campaign via: CampaignId - from: Deal type: has_many to: DealProduct via: Products - from: DealCreate type: belongs_to to: Campaign via: CampaignId - from: DeferredDeepLinkRequest type: belongs_to to: Campaign via: CampaignId - from: DetailedLineItem type: belongs_to to: Account via: AccountId - from: DetailedLineItem type: belongs_to to: Program via: ProgramId - from: ErrorResponse type: has_many to: Error via: errors - from: ErrorResponse type: has_many to: Warning via: warnings - from: EventNotificationPayload type: has_many to: EventNotificationItem via: items - from: EventPayout type: has_many to: Limit via: Limits - from: EventPayout type: has_many to: PayoutAdjustment via: PayoutAdjustments - from: EventPayout type: has_many to: PayoutGroup via: PayoutGroups - from: EventPayout type: has_many to: PayoutRestriction via: PayoutRestrictions - from: EventPayout type: has_many to: ValidReferral via: ValidReferrals - from: EventPayout type: has_one to: Locking via: Locking - from: EventPayout type: has_one to: PayoutScheduling via: PayoutScheduling - from: EventPayout type: has_one to: PerformanceBonus via: PerformanceBonus - from: ExceptionList type: belongs_to to: Campaign via: CampaignId - from: ExceptionListCreate type: belongs_to to: Campaign via: CampaignId - from: ExportList type: has_many to: Export via: data - from: FraudSignals type: has_one to: FraudSignal via: email - from: FraudSignals type: has_one to: FraudSignal via: ip - from: FraudSignals type: has_one to: FraudSignal via: name - from: FraudSignals type: has_one to: FraudSignal via: rate - from: FtpErrorDetail type: belongs_to to: Campaign via: CampaignId - from: FtpErrorDetail type: belongs_to to: MediaPartner via: MediaPartnerId - from: FtpSubmission type: belongs_to to: Account via: AccountId - from: Invoice type: has_many to: DetailedLineItem via: DetailedLineItems - from: Invoice type: has_many to: LineItem via: LineItems - from: Item type: belongs_to to: Campaign via: CampaignId - from: Item type: belongs_to to: Catalog via: CatalogId - from: Job type: belongs_to to: Program via: ProgramId - from: LegalEntity type: has_one to: Address via: BillingAddress - from: LegalEntity type: has_one to: OrganizationType via: OrganizationType - from: LineItem type: belongs_to to: Campaign via: CampaignId - from: MediaProperty type: has_many to: RevenueModel via: RevenueModel - from: MediaProperty type: has_one to: InstallsFollowers via: Followers - from: MediaProperty type: has_one to: InstallsFollowers via: Installs - from: MediaProperty type: has_one to: MobilePlatform via: MobilePlatform - from: MediaProperty type: has_one to: PropertyType via: Type - from: MediaProperty type: has_one to: SocialPlatform via: SocialPlatform - from: OpenUser type: has_one to: ProgramShareLink via: programShareLinks - from: PageLoadRequest type: belongs_to to: Campaign via: CampaignId - from: PageLoadResponse type: has_many to: Warning via: warnings - from: PayoutAdjustment type: has_many to: Rule via: Rules - from: PayoutGroup type: has_many to: Limit via: Limits - from: PayoutGroup type: has_many to: Rule via: Rules - from: PayoutRestriction type: has_many to: Rule via: Rules - from: PerformanceBonus type: has_many to: PerformanceBonusTier via: Tiers - from: Program type: belongs_to to: Campaign via: CampaignId - from: Program type: has_many to: CountryCode via: ShippingRegions - from: PromoCode type: belongs_to to: Campaign via: CampaignId - from: PromoCode type: belongs_to to: Deal via: DealId - from: PromoCode type: has_one to: CreditRule via: CreditRule - from: PromoCode type: has_one to: MatchMode via: MatchMode - from: PromoCodeCreate type: belongs_to to: Campaign via: CampaignId - from: PromoCodeCreate type: belongs_to to: Deal via: DealId - from: PromoCodeExceptionList type: belongs_to to: Campaign via: CampaignId - from: Referral type: has_one to: Reward via: referredReward - from: Referral type: has_one to: User via: referredUser - from: Referral type: has_one to: User via: referrerUser - from: ReferralList type: has_many to: Referral via: referrals - from: ReferralModerationBulkRequest type: has_many to: ReferralModerationRequest via: actions - from: ReportMetadata type: has_many to: ReportAttribute via: Attributes - from: ReportMetadata type: has_many to: ReportFilter via: Filters - from: Reward type: has_many to: Redemption via: redemptions - from: RoutingRule type: has_one to: Interstitial via: Interstitial - from: ScheduledTerm type: has_many to: EventPayout via: EventPayouts - from: Sharelink type: has_one to: LegacyEngagementLinks via: EMAIL - from: Sharelink type: has_one to: LegacyEngagementLinks via: EMBED - from: Sharelink type: has_one to: LegacyEngagementLinks via: HOSTED - from: Sharelink type: has_one to: LegacyEngagementLinks via: MOBILE - from: Sharelink type: has_one to: LegacyEngagementLinks via: POPUP - from: Sharelink type: has_one to: SharelinkEngagementMedium via: EMAIL - from: Sharelink type: has_one to: SharelinkEngagementMedium via: EMBED - from: Sharelink type: has_one to: SharelinkEngagementMedium via: HOSTED - from: Sharelink type: has_one to: SharelinkEngagementMedium via: MOBILE - from: Sharelink type: has_one to: SharelinkEngagementMedium via: POPUP - from: Store type: has_many to: StoreGroup via: Groups - from: StoreGroup type: belongs_to to: Catalog via: CatalogId - from: SubmissionStatus type: belongs_to to: Job via: JobId - from: Task type: has_many to: Attachment via: Attachments - from: Task type: has_many to: Comment via: Comments - from: Task type: has_one to: TaskDetails via: Details - from: Task type: has_one to: TaskReference via: Reference - from: Task type: has_one to: User via: AssigneeUser - from: Task type: has_one to: User via: CreatedBy - from: Task type: has_one to: User via: LastUpdatedBy - from: TaskReference type: belongs_to to: Partner via: PartnerId - from: TaxDocument type: belongs_to to: User via: UserId - from: TemplateTerms type: has_many to: EventPayout via: EventPayouts - from: TemplateTerms type: has_many to: PromotionalTerm via: PromotionalTerms - from: Terms type: has_many to: EventPayout via: EventPayouts - from: Terms type: has_many to: SpecialTerm via: SpecialTermsList - from: TrackingLinkCreate type: belongs_to to: Ad via: AdId - from: TrackingValueApproval type: belongs_to to: Deal via: DealId - from: TrackingValueRequest type: belongs_to to: Campaign via: CampaignId - from: TrackingValueRequest type: belongs_to to: Deal via: DealId - from: TrackingValueRequest type: belongs_to to: MediaPartner via: MediaPartnerId - from: UnsubscribedContact type: belongs_to to: Partner via: PartnerId - from: UnsubscribedContactsResponse type: has_many to: UnsubscribedContact via: Results - from: User type: has_many to: AccessRight via: AccessRights - from: User type: has_one to: Sharelink via: shareLinks - from: User type: has_one to: UserState via: State - from: UserList type: has_many to: User via: users - from: UserPII type: has_one to: ProgramShareLink via: programShareLinks id_conventions: style: PascalCase Id integer or string account_scoping: Every path is scoped by {AccountSID}, which is also the HTTP Basic username. uri_field: Most resources return a Uri field - the relative API path back to the object - which is the closest thing to a hypermedia link in the API. prefixed_ids: false note: impact.com does not use type-prefixed identifiers. IDs are bare integers or opaque strings, so an ID alone does not tell you what it points at. persona_partitioning: brand: /Advertisers/{AccountSID}/... partner: /Mediapartners/{AccountSID}/... agency: /Agencies/{AccountSID}/... advocate: https://app.referralsaasquatch.com/api/v1/{tenant_alias}/... note: The same conceptual entities (Action, Campaign, Deal, Invoice, PromoCode, Catalog) are modelled separately per persona with different schemas and different field sets. Advocate is a wholly separate model - User, Referral, Reward, RewardBalance, ShareLink - inherited from SaaSquatch. findings: - Campaign and Program are the same entity under two names. The path segment is /Campaigns, the Brand Programs API documents it as a Program, and v14 added a type field to Programs to distinguish campaign formats. Integrators have to hold both names. - MediaPartner and Partner are likewise interchangeable across schemas and paths. - There is no shared components library across the 69 documents. Address, Contact and Money-shaped objects are redefined per document, so the same concept has several incompatible schema definitions. relationship_count: 185