---
title: "Verify Goal Phone Code"
method: POST
path: "/goals/phone/verify"
tags: ["goals"]
---

# Verify Goal Phone Code

`POST /goals/phone/verify`

Check the code the athlete typed back; on a match the phone is proven.

Every outcome is a 200 with a name the page can render its own copy for —
a wrong code is the athlete mistyping, not an HTTP failure. The store
burns an attempt per mismatch and refuses a record out of attempts, so
the only move left after ``attempts_exhausted`` or ``expired`` is
requesting a fresh code. The proven phone comes back from the store, not
echoed from any request, so what the caller learns is what was verified.

## Request body

- GoalPhoneVerifyRequest — The code the athlete typed back from their phone.
  - `code` string, required

## Response `200`

Successful Response

- GoalPhoneVerifyResponse — The check's outcome; ``phone`` names the proven number only on ``verified``.
  - `outcome` 'verified' | 'invalid' | 'expired' | 'attempts_exhausted', required
  - `phone` string, nullable

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-02** `55d56c4beab4` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/imperfect/apis/imperfect-api/changes/goals/phone/verify/post.md)

---

[API](https://skmtc.dev/imperfect/apis/imperfect-api.md) · [All operations](https://skmtc.dev/imperfect/apis/imperfect-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/imperfect/imperfect-api/revisions/53750ba952fc/schema)
