---
title: "File one public profile or listing the person already has on a directory site (Settings, Your profiles), so AfterLaunch counts it as a verified presence and a weekly check confirms it is still live. Scope 'act'; free, unmetered, every plan. The same validation the Settings form runs: surface is one of the directory site ids, and url must sit on that site's own host with a profile-shaped path. One address per site: a new address replaces the old one and clears its earlier confirmation, and the same address again is answered without a write. The save runs one free check that the page is live, at most one per product run per 30 seconds."
method: POST
path: "/api/v1/profiles/record"
---

# File one public profile or listing the person already has on a directory site (Settings, Your profiles), so AfterLaunch counts it as a verified presence and a weekly check confirms it is still live. Scope 'act'; free, unmetered, every plan. The same validation the Settings form runs: surface is one of the directory site ids, and url must sit on that site's own host with a profile-shaped path. One address per site: a new address replaces the old one and clears its earlier confirmation, and the same address again is answered without a write. The save runs one free check that the page is live, at most one per product run per 30 seconds.

`POST /api/v1/profiles/record`

## Request

- Base URL: `https://afterlaunch.io`
- URL: `https://afterlaunch.io/api/v1/profiles/record`
- Auth: HTTP bearer

## Request body

- object
  - `surface` 'g2' | 'capterra' | 'getapp' | 'software-advice' | 'trustradius' | 'clutch' | 'trustpilot' | 'product-hunt' | 'alternativeto' | 'saashub' | 'betalist' | 'sourceforge' | 'uneed' | 'theres-an-ai-for-that' | 'openalternative' | 'awesome-selfhosted' | 'railway-templates' | 'vercel-templates' | 'futurepedia' | 'hacker-news' | 'indie-hackers' | 'reddit' | 'quora' | 'wikidata' | 'crunchbase' | 'linkedin-company' | 'google-business-profile' | 'github' | 'wikipedia' | 'youtube-channel' | 'stackshare', required: The directory site id.
  - `url` string, required: The full https address of their profile on that site.

## Response `200`

Recorded, or the same address was already saved (recorded false, reason already_saved). replaced_url is the address this one replaced on the same site, or null; verified says whether the free check confirmed the page live just now (false is not a failure: the weekly check confirms it later); profiles carries every profile on record.

- object
  - `data` object, required
  - `meta` object, required
    - `enrollment_id` string, uuid, required
    - `generated_at` string, date-time, required

## Other responses

- `400`: surface is not a directory site id, or url is missing, too long, or not a profile address on that site.
- `401`: Missing, invalid or revoked API key.
- `403`: The key does not carry the scope this endpoint requires.
- `404`: No product run is bound to this key, or it is superseded.
- `429`: Per-key rate limit exceeded. Honour Retry-After.
- `503`: Not saved: the profiles could not be read or written. Send it again.

---

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