---
title: "Record Registration"
method: POST
path: "/onboarding/registered"
tags: ["onboarding"]
---

# Record Registration

`POST /onboarding/registered`

## Request

- Base URL: `https://api.framesail.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.framesail.com/onboarding/registered`
- Auth: HTTP bearer

Send the Meta CompleteRegistration conversion for the caller's account.

Called by the frontend on a new account's first session
(PostHogAuthBridge), next to the pixel's `sign_up` push. The browser call
is the only sign-up moment that has the client's IP, user agent and Meta
cookies — the users-INSERT webhook has none of them. event_id is the user
id, matching the pixel push, so Meta keeps one of the pair.

Authenticated, so the account is the caller's own; accounts older than
REGISTRATION_WINDOW are ignored, so replaying the call later can't count a
second registration. Always 200 {"received": true}: the browser only needs
to know it can stop reporting, and a conversion is best-effort — a DB or
queue hiccup is logged, never surfaced.

## Request body

- MetaBrowserContext: What only the browser knows about a conversion, for the Meta Conversions API (providers/meta_capi.py). The client IP and user agent come off the request itself; these ride in the body (lib/meta-browser.ts). Every field is optional: an ad-blocked or cookieless browser has no _fbp, most visitors never clicked an ad (no _fbc), and a stale frontend sends nothing at all — none of which may fail the request it rides on.
  - `fbp` string, nullable
  - `fbc` string, nullable
  - `source_url` string, nullable

## Response `200`

Successful Response

- RegisteredResponse
  - `received` boolean

## Other responses

- `422`: Validation Error

---

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