Skip to main content

Overview

A PlatformRequest is the canonical envelope that an AI platform sends to an AIP operator to initiate intent-based monetization. It is operator-agnostic: any conforming operator can process it. The schema is designed around five principles:
  1. Consent is first-class. Every request carries an explicit consent envelope. No consent, no processing.
  2. Classification has two modes. The platform either sends the interaction and the operator classifies it (operator-derived), or the platform sends pre-computed signals and the operator validates them (platform-derived).
  3. Policy is auditable. The operator produces a structured policy decision with thresholds, basis, and sensitivity — separate from classification and monetization.
  4. Monetization is not just auction. The monetization block supports auction as one mechanism, not the only one.
  5. Identity is quarantined by default. Platform-internal fields live in identity.quarantined and must never be forwarded downstream.

Top-Level Fields

FieldTypeRequiredDescription
spec_versionstringYes"1.0"
message_idstringYesCanonical per-message identifier used for auction identity, replay, dedupe, and downstream traceability
timestampstringYesRFC 3339 timestamp when the platform generated the request
platformobjectYesThe AI platform producing the request
identityobjectYesAnonymous or pseudonymous subject identity
consentobjectYesEffective consent state for this request
classification_inputobjectYesInteraction data or pre-computed signals — exactly one mode
policy_hintsobjectNoNon-binding hints from the platform
signal_validationobjectNoOperator validation metadata (platform-derived mode only)
policyobjectNoAuditable policy decision
monetizationobjectNoMonetization configuration and runtime controls

Identifier Model

AIP uses one top-level identifier on PlatformRequest:
  • message_id: canonical conversation-turn identifier used for auction identity, replay, dedupe, and downstream traceability
If your SDK or UI layer uses messageId, treat it as a client alias that maps to canonical message_id at the API boundary.

platform

FieldTypeRequiredDescription
platform_idstringYesPlatform identifier
rolestringYesMust be "platform"
software.namestringYesSoftware name (e.g. "assistant_app")
software.versionstringYesSoftware version (e.g. "1.2.0")

identity

FieldTypeRequiredDescription
namespacestringYesIdentity namespace (e.g. "platform_user")
value_hashstringYesHashed or pseudonymous identity value
confidencenumberNoIdentity confidence (0.01.0)
quarantinedobjectNoPlatform-internal fields that must never be forwarded downstream

Every request must carry an explicit consent envelope. The operator must not process a request where consent is denied or unknown without a policy basis for doing so.
FieldTypeRequiredDescription
statusstringYes"granted", "denied", "unknown", "not_required"
sourcestringNoSource of consent: "platform_ui", "account_setting", "jurisdiction_default"
scopeobjectYesWhat is consented to (see below)
constraintsobjectYesWhat may be forwarded downstream (see below)
captured_atstringNoRFC 3339 timestamp of consent capture
proof_refstringNoReference to consent proof record
FieldTypeRequiredDescription
intent_based_monetizationbooleanYesWhether the current intent moment may be monetized
agent_participationbooleanYesWhether external brands, agents, tools, or buyers may participate
measurementbooleanYesWhether monetization outcome measurement is permitted
FieldTypeRequiredDescription
allow_identity_downstreambooleanYesWhether identity information may be forwarded
In AIP v1.0, raw query text and message history MUST NEVER be forwarded downstream to brand agents. Those are protocol prohibitions, not consent-controlled options.

classification_input

A PlatformRequest MUST include exactly one classification input form.
FieldTypeRequiredDescription
typestringYes"interaction" (operator-derived) or "provided_signals" (platform-derived)
interactionobjectConditionalRequired when type is "interaction"
signalsobjectConditionalRequired when type is "provided_signals"
If classification_input.type is "interaction", the request is operator-derived. The platform provides the interaction data and the operator derives classification outputs from that interaction.If classification_input.type is "provided_signals", the request is platform-derived. The platform provides structured classification signals and the operator validates, normalizes, and governs those signals before using them for policy or monetization decisions.Platform-derived signals MUST NOT be treated as trusted by default. The operator remains the authoritative decision-maker for validation, policy, monetization eligibility, and downstream participation.

Mode 1: Operator-Derived (type: "interaction")

Use this mode when the platform sends the interaction data and the operator performs classification. The platform provides the user interaction, surface metadata, consent, and identity envelope. The operator then classifies intent, maps taxonomy, evaluates policy, determines monetization eligibility, and optionally runs monetization logic. When to use:
  • The platform does not run its own intent classifier
  • The platform wants the operator to be the source of truth for classification
  • The platform wants simpler integration
  • The operator needs consistent classification across all platforms
Meaning: “Here is what happened. You classify it.”

classification_input.interaction

FieldTypeRequiredDescription
sessionobjectNoSession context
surfaceobjectYesSurface and device metadata
inputobjectYesThe user query and optional message history

interaction.session

FieldTypeRequiredDescription
idstringNoSession identifier
turn_indexintegerNoZero-based turn index in the conversation

interaction.surface

FieldTypeRequiredDescription
channelstringYes"conversation", "search_result", "assistant_panel", "embedded_assistant", "voice_assistant"
interaction_modestringYes"text", "voice", "multimodal"
platformstringYes"web", "mobile", "desktop_app", "browser_extension", "api", "other"
form_factorstringNo"mobile", "desktop", "tablet", "speaker", "other"
osstringNoOperating system (e.g. "macOS", "iOS", "Android")
app_idstringNoPlatform app or client identifier
app_versionstringNoApp version
device_typestringNo"phone", "laptop", "desktop", "tablet", "speaker", "tv", "other"
browserstringNoBrowser name
browser_versionstringNoBrowser version
localestringNoUser locale
countrystringNoISO 3166-1 alpha-2 country code. Pattern: ^[A-Z]{2}$

interaction.input

FieldTypeRequiredDescription
query_textstringYesThe user’s raw query text
messagesarrayNoShort conversation history. Each item: { role, content }

interaction.input.messages[]

FieldTypeRequiredDescription
rolestringYes"user", "assistant", "system", "tool"
contentstringYesMessage content

Operator-derived example

{
  "classification_input": {
    "type": "interaction",
    "interaction": {
      "session": {
        "id": "sess_abc",
        "turn_index": 2
      },
      "surface": {
        "channel": "conversation",
        "interaction_mode": "text",
        "platform": "web",
        "form_factor": "desktop",
        "device_type": "laptop",
        "os": "macOS",
        "browser": "Chrome",
        "browser_version": "146.0.0.0",
        "locale": "en-US",
        "country": "US"
      },
      "input": {
        "query_text": "best CRM for small sales team",
        "messages": [
          { "role": "user", "content": "I need a CRM" },
          { "role": "assistant", "content": "What size is your team?" }
        ]
      }
    }
  }
}

Mode 2: Platform-Derived (type: "provided_signals")

Use this mode when the platform has already generated structured intent signals and sends those signals to the operator. The platform provides structured intent output, signal provenance, optional taxonomy and inferred context. The operator then validates the provided signals, normalizes scores if needed, applies trust rules, evaluates policy, and determines monetization eligibility. The operator MUST NOT assume that platform-provided signals are trusted by default. When to use:
  • The platform runs its own classifier
  • The platform runs a certified shared classifier locally
  • The platform wants lower latency or less raw interaction sharing
  • The operator supports signal validation for upstream classification
Meaning: “Here is our classification. Validate and act on it if acceptable.”

classification_input.signals

FieldTypeRequiredDescription
sourceobjectYesSignal provenance and trust metadata
intentobjectYesStructured intent classification
iab_contentobjectNoIAB Content Taxonomy mapping
contextobjectNoInferred entities and constraints

signals.source

FieldTypeRequiredDescription
typestringYes"platform_model", "operator_model", "third_party"
namestringYesModel or classifier name
versionstringYesModel version
calibration_versionstringNoCalibration profile version
trust_tierstringNo"unverified", "self_attested", "certified", "operator_verified", "operator_hosted"

signals.intent

FieldTypeRequiredDescription
typestringYes"commercial", "transactional", "informational", "navigational", "support", "unsafe", "unknown"
subtypestringNoInteraction pattern (e.g. "comparison", "product_discovery")
decision_phasestringYes"awareness", "research", "consideration", "decision", "action", "post_purchase", "support"
confidencenumberNo0.01.0
commercial_scorenumberNo0.01.0

signals.iab_content

FieldTypeDescription
taxonomystringTaxonomy name (e.g. "IAB Content Taxonomy")
taxonomy_versionstringVersion (e.g. "3.1")
tier1stringTop-level category
tier2stringSecond-level category
tier3stringThird-level category

signals.context

FieldTypeDescription
entitiesstring[]Named entities from the query
constraintsobjectDecision-relevant constraints

Platform-derived example

{
  "classification_input": {
    "type": "provided_signals",
    "signals": {
      "source": {
        "type": "platform_model",
        "name": "intent_model_v3",
        "version": "3.2.1",
        "calibration_version": "2026-03",
        "trust_tier": "self_attested"
      },
      "intent": {
        "type": "commercial",
        "subtype": "comparison",
        "decision_phase": "decision",
        "confidence": 0.89,
        "commercial_score": 0.94
      },
      "iab_content": {
        "taxonomy": "IAB Content Taxonomy",
        "taxonomy_version": "3.1",
        "tier1": "Business and Finance",
        "tier2": "Business",
        "tier3": "Business I.T."
      },
      "context": {
        "entities": ["HubSpot", "Zoho", "Salesforce"],
        "constraints": { "company_size": "small_team" }
      }
    }
  }
}

Normative Difference Between Modes

Operator-DerivedPlatform-Derived
Input sourceInteraction dataPlatform-generated signals
Classifier ownerOperatorPlatform
Classification authorityOperatorPlatform initially; operator controls trust, policy, and eligibility
Best forConsistency and auditabilityAdvanced integrations and lower raw data sharing

policy_hints

Non-binding hints from the platform. The operator may use or ignore them.
FieldTypeDescription
latency_budget_msintegerRequested latency budget in milliseconds
preferred_pricing_modelstring"CPX", "CPC", "CPA"

signal_validation

Present only when classification_input.type is "provided_signals". Contains the operator’s validation and normalization metadata for platform-derived signals.
FieldTypeDescription
statusstring"accepted", "accepted_with_normalization", "rejected", "not_applicable"
trust_tier_appliedstringTrust tier the operator applied to the signals
normalized_scores.confidencenumberOperator-normalized confidence (0.01.0)
normalized_scores.commercial_scorenumberOperator-normalized commercial score (0.01.0)
drift_riskstring"low", "medium", "high", "unknown"
reasonstringHuman-readable explanation
The operator MAY reject platform-derived signals if:
  • Provenance is missing
  • Trust tier is insufficient
  • Calibration is unknown
  • Signals fail validation
  • The request falls into a restricted policy class

policy

Auditable policy decision produced after consent, classification, validation, and operator rules are applied.
FieldTypeDescription
consent_eligibilitystring"allowed", "restricted", "not_allowed"
monetization_eligibilitystring"allowed", "allowed_with_caution", "restricted", "not_allowed"
decision_basisstringSee enum below
reasonstringHuman-readable explanation
applied_thresholdsobject{ confidence_min, commercial_score_min }
sensitivitystring"low", "medium", "high", "prohibited"
regulated_verticalbooleanWhether regulated-vertical controls apply
opportunityobjectMonetization opportunity type and strength
decision_basis values: interaction_classification · provided_signal · normalized_signal · score_threshold · policy_override · regulated_vertical_control · manual_override · consent_denied · consent_unknown · fallback

policy.opportunity

FieldTypeDescription
typestring"none", "soft_recommendation", "comparison_slot", "decision_moment", "transaction_trigger"
strengthstring"low", "medium", "high"

monetization

Monetization configuration and runtime controls. Auction is one monetization mechanism, not the only one.
FieldTypeDescription
enabledbooleanWhether monetization is enabled for this request
pricing_modelstring"CPX", "CPC", "CPA"
auction.enabledbooleanWhether auction is enabled
auction.floor.amountnumberFloor price amount
auction.floor.currencystringISO 4217 currency code

Processing Expectations

For operator-derived requests

The operator SHOULD:
  • Derive intent from the interaction
  • Produce classification outputs internally
  • Use those outputs as the basis for policy and monetization decisions

For platform-derived requests

The operator SHOULD:
  • Inspect signal provenance
  • Validate or normalize the provided signals
  • Apply trust-tier logic
  • Use validated or normalized signals as the basis for policy and monetization decisions

Full Example: Operator-Derived

{
  "spec_version": "1.0",
  "message_id": "msg_001_turn_002",
  "timestamp": "2026-03-26T18:30:00Z",
  "platform": {
    "platform_id": "chat_interface_x",
    "role": "platform",
    "software": {
      "name": "assistant_app",
      "version": "1.2.0"
    }
  },
  "identity": {
    "namespace": "platform_user",
    "value_hash": "user_hash_789",
    "confidence": 1.0
  },
  "consent": {
    "status": "granted",
    "source": "platform_ui",
    "scope": {
      "intent_based_monetization": true,
      "agent_participation": true,
      "measurement": true
    },
    "constraints": {
      "allow_identity_downstream": false
    },
    "captured_at": "2026-03-26T18:29:00Z"
  },
  "classification_input": {
    "type": "interaction",
    "interaction": {
      "session": {
        "id": "sess_abc",
        "turn_index": 2
      },
      "surface": {
        "channel": "conversation",
        "interaction_mode": "text",
        "platform": "web",
        "form_factor": "desktop",
        "device_type": "laptop",
        "os": "macOS",
        "browser": "Chrome",
        "browser_version": "146.0.0.0",
        "locale": "en-US",
        "country": "US"
      },
      "input": {
        "query_text": "best CRM for small sales team",
        "messages": [
          { "role": "user", "content": "I need a CRM" },
          { "role": "assistant", "content": "What size is your team?" }
        ]
      }
    }
  },
  "policy_hints": {
    "latency_budget_ms": 500,
    "preferred_pricing_model": "CPX"
  },
  "policy": {
    "consent_eligibility": "allowed",
    "monetization_eligibility": "allowed",
    "decision_basis": "interaction_classification",
    "reason": "commercial intent detected with sufficient confidence",
    "applied_thresholds": {
      "confidence_min": 0.6,
      "commercial_score_min": 0.7
    },
    "sensitivity": "low",
    "regulated_vertical": false,
    "opportunity": {
      "type": "comparison_slot",
      "strength": "high"
    }
  },
  "monetization": {
    "enabled": true,
    "pricing_model": "CPX",
    "auction": {
      "enabled": true,
      "floor": {
        "amount": 0.05,
        "currency": "USD"
      }
    }
  }
}

Full Example: Platform-Derived

{
  "spec_version": "1.0",
  "message_id": "msg_002_turn_000",
  "timestamp": "2026-03-26T18:31:00Z",
  "platform": {
    "platform_id": "chat_interface_x",
    "role": "platform",
    "software": {
      "name": "assistant_app",
      "version": "1.2.0"
    }
  },
  "identity": {
    "namespace": "platform_user",
    "value_hash": "user_hash_456",
    "confidence": 0.98
  },
  "consent": {
    "status": "granted",
    "source": "account_setting",
    "scope": {
      "intent_based_monetization": true,
      "agent_participation": true,
      "measurement": true
    },
    "constraints": {
      "allow_identity_downstream": false
    }
  },
  "classification_input": {
    "type": "provided_signals",
    "signals": {
      "source": {
        "type": "platform_model",
        "name": "intent_model_v3",
        "version": "3.2.1",
        "calibration_version": "2026-03",
        "trust_tier": "self_attested"
      },
      "intent": {
        "type": "commercial",
        "subtype": "comparison",
        "decision_phase": "decision",
        "confidence": 0.89,
        "commercial_score": 0.94
      },
      "iab_content": {
        "taxonomy": "IAB Content Taxonomy",
        "taxonomy_version": "3.1",
        "tier1": "Business and Finance",
        "tier2": "Business",
        "tier3": "Business I.T."
      },
      "context": {
        "entities": ["HubSpot", "Zoho", "Salesforce"],
        "constraints": { "company_size": "small_team" }
      }
    }
  },
  "signal_validation": {
    "status": "accepted_with_normalization",
    "trust_tier_applied": "self_attested",
    "normalized_scores": {
      "confidence": 0.76,
      "commercial_score": 0.83
    },
    "drift_risk": "medium",
    "reason": "source accepted but normalized to network calibration profile"
  },
  "policy": {
    "consent_eligibility": "allowed",
    "monetization_eligibility": "allowed_with_caution",
    "decision_basis": "normalized_signal",
    "reason": "provided signals accepted after normalization",
    "applied_thresholds": {
      "confidence_min": 0.6,
      "commercial_score_min": 0.7
    },
    "sensitivity": "low",
    "regulated_vertical": false,
    "opportunity": {
      "type": "comparison_slot",
      "strength": "high"
    }
  },
  "monetization": {
    "enabled": true,
    "pricing_model": "CPX",
    "auction": {
      "enabled": true,
      "floor": {
        "amount": 0.07,
        "currency": "USD"
      }
    }
  }
}

Validation Rules

  • spec_version must be "1.0".
  • message_id must be a non-empty string.
  • timestamp must be RFC 3339.
  • platform.role must be "platform".
  • consent must contain status, scope, and constraints.
  • classification_input must contain exactly one of interaction or signals based on type.
  • When type is "interaction", interaction.input.query_text and interaction.surface are required.
  • When type is "provided_signals", signals.source and signals.intent are required.
  • signals.intent must contain type and decision_phase.
  • identity.quarantined must never be forwarded downstream.
  • consent.constraints.allow_identity_downstream must be respected when forwarding identity-related data.
  • Raw query text and message history must never be forwarded downstream to brand agents in v1.0.

Schema File

JSON Schema (Draft 2020-12): platform-request.json