---
title: "Record where a new workspace came from"
method: POST
path: "/attribution/signup-source/"
tags: ["attribution"]
---

# Record where a new workspace came from

`POST /attribution/signup-source/`

## Request

- Base URL: `https://api.getoneprofile.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.getoneprofile.ai/attribution/signup-source/`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Record the marketing page or campaign the caller's workspace signed up from: the `src` tag and the `utm_source`, `utm_medium` and `utm_campaign` values the register link carried. The app sends it once, right after signup. First touch wins: a workspace keeps the first source recorded for it, and one that is no longer registering records nothing. Neither is an error; both report `recorded: false`. Requires a signed-in user rather than an API key: a signup has a person behind it.

## Request body

- SignupSourceClaimRequestSchema: The source a new workspace's first link carried, sent once after signup.
  - `src` string, nullable: The marketing site's own source tag from the register link's `src` parameter, `<lane>-<slug>[-<slot>]`, for example `blog-what-is-data-enrichment-moment`.
  - `utm_campaign` string, nullable: The register link's `utm_campaign` parameter, if it had one.
  - `utm_medium` string, nullable: The register link's `utm_medium` parameter, if it had one.
  - `utm_source` string, nullable: The register link's `utm_source` parameter, if it had one.

## Response `200`

Successful Response

- SignupSourceClaimReadSchema: The outcome of recording a signup source. Always 200 for a well formed body. A workspace that already has a source keeps it, and one that is no longer registering gets none: both report `recorded: false`, because neither is something to alarm a new user about.
  - `recorded` boolean, required: Whether this call recorded the source for the workspace.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Workspace not found.
- `422`: Invalid request made to the API.
- `500`: Internal server error.
- `502`: Bad gateway error.
- `503`: Service unavailable.

---

[API](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile.md) · [All operations](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/llms.txt) · [OpenAPI document](https://skmtc.dev/getoneprofile/apis/api-reference-oneprofile/revisions/4a6bd71e3f02?raw)
