---
title: "Stamp one onboarding milestone for the caller (spec 1.2)."
method: POST
path: "/api/v1/affiliate/milestones"
tags: ["Affiliate"]
---

# Stamp one onboarding milestone for the caller (spec 1.2).

`POST /api/v1/affiliate/milestones`

## Request

- Base URL: `https://api.avatarfactory.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.avatarfactory.io/api/v1/affiliate/milestones`
- Auth: one of:
  - API key in cookie `session`
  - HTTP bearer

<br/>`{"event": "link_copied"}` is the only body this accepts; anything else<br/>is 422 `invalid_event`. The portal calls it when the affiliate copies<br/>their link, which is the one checklist step with no server seam of its<br/>own: copying happens in the clipboard, not in an API call.<br/><br/>Idempotent by construction. The first stamp wins in SQL, so two tabs<br/>pressing copy cannot move a date the checklist has already shown, and the<br/>route answers 204 either way rather than telling the client whether it<br/>was first.

## Request body

- MilestoneRequest: A onboarding milestone the portal reports (spec 1.2). `event` is a plain bounded string rather than a pattern or an enum so the refusal comes back as this module's `ErrorResponse` with `code: invalid_event`, the shape every other affiliate route answers with, instead of the validator's generic blob.
  - `event` string, required

## Response `204`

No Content

## Other responses

- `404`: Not Found
- `422`: Unprocessable Entity

---

[API](https://skmtc.dev/avatarfactory/apis/avatarfactory-api.md) · [All operations](https://skmtc.dev/avatarfactory/apis/avatarfactory-api/llms.txt) · [OpenAPI document](https://skmtc.dev/avatarfactory/apis/avatarfactory-api/revisions/66fc7aa3f296?raw)
