---
title: "Signup Sources"
method: GET
path: "/api/users/signup-sources"
tags: ["users"]
---

# Signup Sources

`GET /api/users/signup-sources`

## Request

- Base URL: `https://softkiln.com` (the document declares no server; this is the origin it was published from)
- URL: `https://softkiln.com/api/users/signup-sources`
- Auth: none declared

Where the accounts came from — the whole point of the capture.

Aggregated in Python rather than in SQL because `signup_attribution` is
JSON on SQLite and JSONB on Postgres, and the two disagree about how you
reach into it. The row count here is accounts, not events; this stays cheap
for far longer than a `->>` expression would be worth.

## Response `200`

Successful Response

- SignupSourcesOut
  - `total_accounts` integer, required
  - `unattributed` integer, required
  - `sources` SignupSourceOut[], required
    - `source` string, required
    - `accounts` integer, required
    - `campaigns` string[], required
    - `group` string, nullable, required
    - `first_account_at` string, nullable, required
    - `last_account_at` string, nullable, required
  - `groups` SignupSourceGroupOut[], required
    - `group` string, required
    - `accounts` integer, required
    - `sources` string[], required

---

[API](https://skmtc.dev/softkiln/apis/app-manager-api.md) · [All operations](https://skmtc.dev/softkiln/apis/app-manager-api/llms.txt) · [OpenAPI document](https://skmtc.dev/softkiln/apis/app-manager-api/revisions/8e293a417e4a?raw)
