AckdbScoreCapabilities
What this server's score validator accepts (#438): the contract a builder renders from instead of probing for support by saving throwaway definitions. Static, since it mirrors the validator's own constants, so it needs no DB round trip.
Properties
grainsarray ofrequiredGrains a definition can be created on.
"company""person"scopesobjectrequiredSegment scoping (#443) — what scopeSegmentId accepts. Render the segment picker from this rather than assuming grain-for-grain: any segment grain may scope any score grain.
segmentKindsarray ofrequired"company""contact""person"derivedbooleanrequiredWhether a derived segment is a legal scope.
aggregatesarray ofrequiredEvery aggregate reducer, with the grains and scoring modes each one allows. Render the aggregate picker from this: a scoring mode absent from `scoring` is a 400, not a fallback.
valuestringrequired"count""sum""distinct_contacts""latest"grainsarray ofrequiredLegal grains. distinct_contacts is company-only (the person grain has no contact rail).
"company""person"scoringarray ofrequiredScoring modes this reducer accepts. Only `latest` accepts `match`.
"bands""perUnitPoints""match"requiresstringThe extra field knob this reducer requires, if any.
"sumField""valueField"halfLifebooleanrequiredFalse when halfLifeDays does not compose (distinct_contacts, latest), where it 400s.
matchOpsarray ofrequiredMatch operators the validator accepts, on every matchable field kind.
"eq""in""present"normalizationsarray ofrequired"absolute""percentile"percentilePopulationsarray ofrequiredPercentile ranking populations (#432). Rejected on absolute definitions.
"all""active"convergenceModesarray ofrequiredConvergence list shapes, exactly one per criterion (#414 sources, #421 signals).
"sources""signals"eventValueMatchingstringrequiredHow `match` values compare against event metadata: exact and case-sensitive, the way segment filters compare them (#380 canonicalizes trait values and deliberately left event fields exact). Seed value pickers from /fields/{key}/values rather than accepting free text, since a value differing only in case scores 0.
"exact"limitsobjectrequiredEvery numeric bound the validator enforces. Enforce them client-side to avoid round-trip 400s.
criteriaintegerrequiredMax criteria per definition.
groupsintegerrequiredMax weighted groups per definition.
matchEntriesintegerrequiredMax match entries per criterion (and values per entry).
bandsintegerrequiredMax bands per criterion.
labelsintegerrequiredMax label bands per definition.
pointsintegerrequiredAbsolute bound on match/band points (±).
perUnitPointsintegerrequiredAbsolute bound on the per-unit slope (±).
capintegerrequiredMax perUnitPoints cap (0 < cap ≤ this).
windowDaysintegerrequiredMax trailing window on an event aggregate.
convergenceWindowDaysintegerrequiredMax window on a convergence criterion, tighter than windowDays.
convergenceSignalsintegerrequiredMax signals in a signals-mode list.
Example
{
"grains": [
"company"
],
"scopes": {
"segmentKinds": [
"company"
],
"derived": false
},
"aggregates": [
{
"value": "count",
"grains": [
"company"
],
"scoring": [
"bands"
],
"requires": "sumField",
"halfLife": false
}
],
"matchOps": [
"eq"
],
"normalizations": [
"absolute"
],
"percentilePopulations": [
"all"
],
"convergenceModes": [
"sources"
],
"eventValueMatching": "exact",
"limits": {
"criteria": 50,
"groups": 10,
"matchEntries": 0,
"bands": 0,
"labels": 0,
"points": 100,
"perUnitPoints": 0,
"cap": 0,
"windowDays": 3650,
"convergenceWindowDays": 365,
"convergenceSignals": 20
}
}