---
title: "Resolve Touchpoint"
method: POST
path: "/api/v1/ottr/resolve-touchpoint"
tags: ["ottr"]
---

# Resolve Touchpoint

`POST /api/v1/ottr/resolve-touchpoint`

Boundary guard: this endpoint must never return a 5xx.

``_resolve_touchpoint`` already refuses on every failure it anticipates.
This exists for the ones it does not. Staging found two -- an unknown
campaign and an inverted range -- and both were 500s reaching a Brain run
that had already paid for classification. The specific causes are fixed;
this makes the CLASS of failure impossible rather than fixing them one at
a time.

Deliberately a wrapper rather than another nested try: the resolver is
already at the edge of the cognitive-complexity limit, and a guard that
makes the guarded function harder to read is a bad trade.

HTTPException passes through untouched -- a 404 for an unknown campaign is
a deliberate answer, not an escaped error.

## Request body

- ResolveTouchpointRequest
  - `campaign_id` string, required
  - `campaign_contact_id` string, required
  - `local_date` string, date, required
  - `earliest_local` string, required
  - `latest_local` string, required
  - `channel` string

## Response `200`

Successful Response

- ResolveTouchpointResponse
  - `scheduled_utc` string, date-time, nullable
  - `scheduled_local` string, nullable
  - `channel` string, required
  - `sampled_hour_local` integer, nullable
  - `eligible_hours_local` integer[]
  - `resolved` boolean
  - `reason` string, nullable

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/outrival/apis/fastapi.md) · [All operations](https://skmtc.dev/outrival/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/outrival/fastapi/revisions/84ff9d4fb546/schema)
