---
title: "A new Smart Link was authored in a project."
method: POST
path: "link.created"
tags: ["link.* events"]
---

# A new Smart Link was authored in a project.

`POST link.created` (webhook)

### When this fires

A creator authored a new Smart Link on the dashboard, over the REST API or via the `create_link` MCP tool. The link answers at `url` from this moment: a click counts, the visit waits in the visitor's browser for up to thirty days, and the member who signs in inside that window is attributed to the link.

It fires on **authoring**, not on the first click. A link created with an `expires_at` fires this immediately and stops counting when that instant passes; there is no separate event for the expiry.

### Related events

- `link.updated`: the link's fields changed.
- `link.archived`: the link was put out of use.

## Headers

- `SB-Signature` string, required
- `SB-Event-Id` string, required
- `SB-Event-Name` string, required
- `Content-Type` string, required
- `User-Agent` string, required

## Payload

- object: The envelope every event is delivered in.
  - `id` string, required: A ULID unique to the event, prefixed `evt_`. Every retry carries the same id, so it is the key to deduplicate on.
  - `type` 'link.created', required: The event name, always `link.created` here.
  - `created_at` string, date-time, required: When the event was emitted, server time, ISO 8601.
  - `api_version` string, required: The contract version of the payload shape, `2026-05-01` today. A breaking change to a shape ships under a new version.
  - `project_id` string, uuid, nullable, required: The project the event belongs to; null for team-scoped and billing events.
  - `data` object, required: The event-specific payload. Keys that do not apply to a given emission are omitted rather than sent as null, so check for presence.
    - `link` object, required: The link snapshot every `link.*` event carries.
      - `id` string, uuid, required: The link's UUID. No prefix; only the envelope `id` is prefixed.
      - `name` string, required: Creator-facing label. Never shown to members.
      - `slug` string, required: The address segment after `/go/`: lowercase letters, digits and hyphens. The creator may rename it.
      - `code` string, required: The stable code the attribution cookie and the bot's `via_` payload carry. **Never changes.**
      - `destination` 'portal' | 'plan' | 'bot', required: Where the link sends people: the plan list, one plan's checkout, or the project's bot.
      - `plan_id` string, uuid, nullable, required: The plan a `plan` destination opens on; `null` for the other destinations.
      - `url` string, required: The web address, `https://my.subscriby.net/{handle}/go/{slug}`. Rebuilt from the slug, so it moves when the slug does.
      - `expires_at` string, date-time, nullable, required: When the link stops counting clicks. `null` means it runs until archived.
      - `archived_at` string, date-time, nullable, required: When the creator put it out of use. Always `null` on this event.
      - `clicks_total` integer, required: Lifetime clicks, counted once per address per link per hour. Always `0` on this event.

## Acknowledgement `2XX`

Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.

## Other responses

- `default`: Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or `POST /v1/webhook-deliveries/{delivery}/retry`. After 20 consecutive failures the endpoint is paused until it is resumed.

---

[API](https://skmtc.dev/memberpass/apis/subscriby-rest-api.md) · [All operations](https://skmtc.dev/memberpass/apis/subscriby-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/memberpass/apis/subscriby-rest-api/revisions/59c4df91d764?raw)
