A place a creator picked on a connector becomes a resource of a project.
When this fires
A creator links a place from a connector: a channel, group or supergroup from the bot's picker, or any connector's own picker answering a link request. The connector writes the resource row and this event announces it. This creates the resource row; no project.resource.created precedes it.
Caveats
- Re-linking a place after an unlink creates a new resource row. The project.resource.linked you receive carries a different resource_id than the earlier project.resource.unlinked, and the unlinked row remains behind with space: null.
- Linking the same place to the same project twice announces nothing the second time: the connector's write is idempotent and answers the existing resource.
- A manual perk cannot be linked; it has no underlying place, so its kind is manual and it arrives through project.resource.created.
Related events
- project.resource.unlinked: paired transition.
- project.resource.created: the separate REST / MCP path for manual perks; not a predecessor of this event.
Headers
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
Response
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
Changes
Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.