# feat.press developer resources

feat.press is the affiliate marketplace for products AI helps you build. This page is the developer entry point for the feat.press HTTP API, OpenAPI specification, authentication, entitlement webhooks, license verification, and the feat.press MCP server.

## OpenAPI specification

The feat.press OpenAPI 3.1 document is published at:

- JSON: https://www.feat.press/openapi.json

It describes public marketplace reads, waitlist intake, license verification, and authenticated app entitlement endpoints.

## Authentication

Public marketplace reads and license verification do not require an API key.

Authenticated merchant-server calls (entitlement lookup, cancel, resume) use the product-scoped feat.press app API key:

`Authorization: Bearer feat_live_<key>`

Keys are created in feat.press under App access for an app product. Never expose them in a browser.

License keys issued to buyers are verified with:

`POST https://www.feat.press/api/licenses/verify`

```json
{ "licenseKey": "…", "productId": "…" }
```

The response is `{ "valid": true, "entitlement": { … } }` or `{ "valid": false }`. Buyer PII is never returned.

## Webhooks

feat.press sends signed JSON to the HTTPS endpoint you configure on an app product when entitlements change.

Headers:

- `feat-signature: t=<unix_seconds>,v1=<hex>`
- `feat-event-id`: idempotency id (same as payload `id`)

Verify by computing HMAC-SHA256 of `${t}.${rawBody}` with your webhook secret and comparing to `v1` in constant time. Reject timestamps older than 300 seconds with HTTP 400. Duplicates must return 200 without side effects.

Event types: `webhook.test`, `entitlement.activated`, `entitlement.renewed`, `entitlement.updated`, `entitlement.cancellation_scheduled`, `entitlement.past_due`, `entitlement.expired`, `entitlement.revoked`.

Payload shape: `{ id, type, apiVersion, createdAt, data }` where `data` includes `entitlementId`, `orderId`, `productId`, `buyerEmail`, `status`, and period fields.

Official SDK: `@feat-press/node` (`createWebhookRoute`, `Feat.licenses.verify`).

## MCP server

The feat.press Model Context Protocol server is at `https://www.feat.press/mcp` (Streamable HTTP, JSON-RPC). Discovery document: https://www.feat.press/.well-known/mcp.json

It advertises resources (docs, OpenAPI, llms.txt) and tools for reading feat.press developer material. `resources/list` returns at least one resource.

## Public HTTP API

| Method | Path | Auth | Purpose |
| --- | --- | --- | --- |
| GET | /api/marketplace/listings | none | Browse live listings |
| GET | /api/marketplace/listings/{slug} | none | Listing detail |
| POST | /api/waitlist | none | Waitlist intake |
| POST | /api/licenses/verify | none | Verify a buyer license key |
| GET | /api/app-entitlements/{id} | Bearer app key | Entitlement snapshot |
| POST | /api/app-entitlements/{id}/cancel | Bearer app key | Cancel at period end |
| POST | /api/app-entitlements/{id}/resume | Bearer app key | Undo scheduled cancel |

Full schemas: https://www.feat.press/openapi.json

## Agent entry points

- HTML: https://www.feat.press/developers
- feat.press API docs: https://www.feat.press/developers/api
- feat.press authentication: https://www.feat.press/developers/authentication
- feat.press webhooks: https://www.feat.press/developers/webhooks
- feat.press MCP server: https://www.feat.press/developers/mcp
- Markdown: `Accept: text/markdown` on this URL, or https://www.feat.press/developers.md
- llms.txt: https://www.feat.press/llms.txt
- MCP: https://www.feat.press/mcp
