Skip to main content
End an SI session. Either the host or brand agent can initiate termination, with different reasons indicating how the session concluded.

Request

FieldTypeRequiredDescription
session_idstringYesSession ID to terminate
reasonstringYesWhy the session is ending
termination_contextobjectNoAdditional context for the termination

Termination Reasons

ReasonMeaningTypical Initiator
handoff_transactionUser wants to complete a purchaseBrand agent (via pending_handoff)
handoff_completeConversation naturally concludedBrand agent
user_exitUser explicitly ended the conversationHost
session_timeoutInactivity timeout reachedHost
host_terminatedHost ended for policy/error reasonsHost

Termination Context Object

Additional details vary by reason: For handoff_transaction:
{
  "intent": { /* purchase intent from handoff */ },
  "context_for_checkout": { /* ACP context */ }
}
For user_exit:
{
  "user_signal": "changed_topic",
  "partial_context": { /* what was discussed */ }
}
For session_timeout:
{
  "last_activity": "2026-01-18T10:30:00Z",
  "timeout_seconds": 300
}

Response

FieldTypeDescription
session_idstringConfirms which session was terminated
terminatedbooleanAlways true on success
acp_handoffobjectPresent for transaction handoffs
follow_upobjectOptional actions for future engagement

ACP Handoff Object

For transaction terminations, includes data needed for ACP checkout:
FieldTypeDescription
checkout_urluriBrand’s ACP checkout endpoint. Hosts MUST validate this is HTTPS.
checkout_tokenstringOpaque token to pass to the checkout endpoint
payloadobjectRich checkout context (product details, applied offers, pricing). Alternative to checkout_token for structured data.
expires_atdatetimeWhen this handoff data expires

Follow-Up Object

Suggestions for future engagement:
FieldTypeDescription
suggested_actionstringWhat the host might do next
dataobjectRelevant data for the action
messagestringOptional message to display

Examples

Transaction Handoff

After receiving pending_handoff with type: "transaction": Request:
{
  "session_id": "sess_abc123",
  "reason": "handoff_transaction",
  "termination_context": {
    "intent": {
      "action": "purchase",
      "product": {
        "type": "flight",
        "flight_number": "DL628"
      }
    }
  }
}
Response:
{
  "session_id": "sess_abc123",
  "terminated": true,
  "acp_handoff": {
    "checkout_url": "https://delta.com/acp/checkout",
    "payload": {
      "session_id": "sess_abc123",
      "flight": "DL628",
      "passenger": {
        "email": "jane@example.com",
        "name": "Jane Smith"
      },
      "applied_offers": ["delta_chatgpt_3313"],
      "price": {
        "amount": 199,
        "currency": "USD"
      }
    },
    "expires_at": "2026-01-18T11:00:00Z"
  }
}

Conversation Complete (No Purchase)

When the conversation naturally ends without a transaction: Request:
{
  "session_id": "sess_abc123",
  "reason": "handoff_complete"
}
Response:
{
  "session_id": "sess_abc123",
  "terminated": true,
  "follow_up": {
    "suggested_action": "save_for_later",
    "data": {
      "flights_discussed": ["DL628", "DL632"],
      "destination": "BOS",
      "travel_date": "2026-01-27"
    },
    "message": "Let me know if you'd like to revisit Boston flights later!"
  }
}

User Exit

When the user changes topic or explicitly leaves: Request:
{
  "session_id": "sess_abc123",
  "reason": "user_exit",
  "termination_context": {
    "user_signal": "changed_topic",
    "partial_context": {
      "flights_viewed": ["DL628"],
      "last_topic": "seat selection"
    }
  }
}
Response:
{
  "session_id": "sess_abc123",
  "terminated": true,
  "follow_up": {
    "suggested_action": "remind_later",
    "data": {
      "incomplete_booking": {
        "flight": "DL628",
        "step": "seat_selection"
      }
    }
  }
}

Session Timeout

When the session times out due to inactivity: Request:
{
  "session_id": "sess_abc123",
  "reason": "session_timeout",
  "termination_context": {
    "last_activity": "2026-01-18T10:25:00Z",
    "timeout_seconds": 300
  }
}
Response:
{
  "session_id": "sess_abc123",
  "terminated": true
}

Host Terminated

When the host ends the session for policy or error reasons: Request:
{
  "session_id": "sess_abc123",
  "reason": "host_terminated",
  "termination_context": {
    "cause": "user_left_app"
  }
}
Response:
{
  "session_id": "sess_abc123",
  "terminated": true
}

ACP Integration Flow

When the reason is handoff_transaction:
  1. Host receives acp_handoff in the termination response
  2. Host initiates ACP checkout using the provided checkout_url and checkout_token or payload
  3. ACP handles the transaction while maintaining the user’s trust with the host
  4. Brand is not the merchant of record - ACP handles payment

Key Points

  1. Always terminate sessions - Even if the conversation seems done, call terminate to clean up resources and get follow-up suggestions.
  2. ACP handoff data has expiration - The expires_at field indicates how long the checkout context is valid.
  3. Follow-up enables re-engagement - Even non-transaction terminations can include suggestions for future engagement.
  4. Host maintains trust - Transactions go through ACP, keeping the user’s relationship with the host intact.