{
  "openapi": "3.1.0",
  "info": {
    "title": "feat.press API",
    "version": "1.0.0",
    "summary": "Public and merchant HTTP API for the feat.press affiliate marketplace.",
    "description": "feat.press is the affiliate marketplace for products AI helps you build. This OpenAPI document covers public marketplace reads, waitlist intake, license verification, and authenticated app entitlement endpoints. Human docs: /developers. MCP: /mcp. Named scopes are on FeatScopes and at /.well-known/oauth-protected-resource. The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
    "contact": {
      "name": "feat.press",
      "url": "https://www.feat.press"
    },
    "license": {
      "name": "Proprietary"
    }
  },
  "servers": [
    {
      "url": "https://www.feat.press",
      "description": "feat.press"
    }
  ],
  "tags": [
    {
      "name": "Marketplace",
      "description": "Public listing catalog."
    },
    {
      "name": "Waitlist",
      "description": "Public waitlist intake."
    },
    {
      "name": "Licenses",
      "description": "Buyer license verification for app products."
    },
    {
      "name": "Entitlements",
      "description": "Merchant-server entitlement lifecycle."
    }
  ],
  "paths": {
    "/api/marketplace/listings": {
      "get": {
        "tags": [
          "Marketplace"
        ],
        "operationId": "listMarketplaceListings",
        "summary": "Browse live feat.press marketplace listings",
        "security": [
          {},
          {
            "FeatScopes": [
              "read:listings"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          },
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Search query."
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "charts",
                "new",
                "reward"
              ]
            }
          },
          {
            "name": "compensation",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "commission",
                "upfront",
                "both"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minCommission",
            "in": "query",
            "schema": {
              "type": "integer",
              "enum": [
                20,
                30,
                50
              ]
            },
            "description": "Minimum commission percent. Other values are ignored."
          },
          {
            "name": "minStorefronts",
            "in": "query",
            "schema": {
              "type": "integer",
              "enum": [
                1,
                5,
                10
              ]
            },
            "description": "Minimum live storefront count. Other values are ignored."
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 48
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Listing page",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingListResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/marketplace/listings/{slug}": {
      "get": {
        "tags": [
          "Marketplace"
        ],
        "operationId": "getMarketplaceListing",
        "summary": "Get a live feat.press listing by slug",
        "security": [
          {},
          {
            "FeatScopes": [
              "read:listings"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Listing",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListingDetailResponse"
                }
              }
            }
          },
          "404": {
            "description": "Listing not found",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/waitlist": {
      "post": {
        "tags": [
          "Waitlist"
        ],
        "operationId": "joinWaitlist",
        "summary": "Join the feat.press waitlist",
        "security": [
          {},
          {
            "FeatScopes": [
              "write:waitlist"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "name": {
                    "type": "string"
                  },
                  "handle": {
                    "type": "string"
                  },
                  "role": {
                    "type": "string",
                    "enum": [
                      "creator",
                      "brand",
                      "both"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            }
          },
          "400": {
            "description": "Invalid email",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/licenses/verify": {
      "post": {
        "tags": [
          "Licenses"
        ],
        "operationId": "verifyLicense",
        "summary": "Verify a feat.press app license key",
        "security": [
          {},
          {
            "FeatScopes": [
              "read:licenses"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "licenseKey"
                ],
                "properties": {
                  "licenseKey": {
                    "type": "string",
                    "minLength": 24,
                    "maxLength": 120
                  },
                  "productId": {
                    "type": "string",
                    "description": "Optional. When set, the license must belong to this product."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Verification result",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseVerifyResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed license key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseVerifyResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LicenseVerifyResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/app-entitlements/{id}": {
      "get": {
        "tags": [
          "Entitlements"
        ],
        "operationId": "getAppEntitlement",
        "summary": "Fetch a feat.press app entitlement by id",
        "security": [
          {
            "AppApiKey": []
          },
          {
            "FeatScopes": [
              "read:entitlements"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Entitlement",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            }
          },
          "401": {
            "description": "Invalid app API key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Entitlement not found",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/app-entitlements/{id}/cancel": {
      "post": {
        "tags": [
          "Entitlements"
        ],
        "operationId": "cancelAppEntitlement",
        "summary": "Cancel a feat.press subscription entitlement at period end",
        "security": [
          {
            "AppApiKey": []
          },
          {
            "FeatScopes": [
              "write:entitlements"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Cancellation scheduled",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            }
          },
          "400": {
            "description": "Missing idempotency key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid app API key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Entitlement not found",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/app-entitlements/{id}/resume": {
      "post": {
        "tags": [
          "Entitlements"
        ],
        "operationId": "resumeAppEntitlement",
        "summary": "Resume a feat.press entitlement scheduled for cancellation",
        "security": [
          {
            "AppApiKey": []
          },
          {
            "FeatScopes": [
              "write:entitlements"
            ]
          }
        ],
        "parameters": [
          {
            "name": "API-Version",
            "in": "header",
            "required": false,
            "description": "The feat.press HTTP API version is a date. The current version is 2026-07-18. Send API-Version: 2026-07-18, or omit the header to select the current version. A breaking change ships as a new date. The previous date stays available for at least 180 days. During that window, responses for the old date include Deprecation (RFC 9745, the HTTP-date deprecation started) and Sunset (RFC 8594, the HTTP-date the old date may stop). The current version is not deprecated, so those headers are omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2026-07-18"
              ],
              "default": "2026-07-18"
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 8,
              "maxLength": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resumed",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            }
          },
          "400": {
            "description": "Missing idempotency key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid app API key",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Entitlement not found",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "headers": {
              "API-Version": {
                "$ref": "#/components/headers/APIVersion"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "AppApiKey": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "feat_sk_live",
        "description": "Product-scoped feat.press app API key from App access. The key is the bearer credential. Named scopes for that key are declared on FeatScopes."
      },
      "FeatScopes": {
        "type": "oauth2",
        "description": "Named least-privilege scopes for the feat.press HTTP API. The bearer credential is the AppApiKey (Authorization: Bearer feat_sk_live_…). feat.press does not mint a separate OAuth access token. tokenUrl is the human authentication guide, not a client-credentials endpoint. Do not POST a token request there. Request only the scopes listed on the operation. The same names are in RFC 9728 scopes_supported at /.well-known/oauth-protected-resource.",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://www.feat.press/developers/authentication",
            "scopes": {
              "read:listings": "Read live feat.press marketplace listings.",
              "write:waitlist": "Submit a feat.press waitlist signup.",
              "read:licenses": "Verify a feat.press app license key.",
              "read:entitlements": "Read a feat.press app entitlement.",
              "write:entitlements": "Cancel or resume a feat.press app entitlement."
            }
          }
        }
      }
    },
    "headers": {
      "APIVersion": {
        "description": "feat.press HTTP API version served by this response. Current value: 2026-07-18.",
        "schema": {
          "type": "string",
          "const": "2026-07-18"
        }
      },
      "Deprecation": {
        "description": "RFC 9745 Deprecation header. Sent only after a version is deprecated. The value is the HTTP-date deprecation started. The current version does not send this header.",
        "schema": {
          "type": "string",
          "example": "Sat, 18 Jul 2026 00:00:00 GMT"
        }
      },
      "Sunset": {
        "description": "RFC 8594 Sunset header. Sent only when a deprecated version has a retirement date. The value is the HTTP-date after which that version may stop. Notice is at least 180 days. The current version does not send this header.",
        "schema": {
          "type": "string",
          "example": "Thu, 14 Jan 2027 00:00:00 GMT"
        }
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "required": [
          "success",
          "error"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "string",
            "description": "Human-readable explanation."
          },
          "correlationId": {
            "type": "string"
          }
        }
      },
      "Listing": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "blurb": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "commissionPercent": {
            "type": "number"
          },
          "compensationType": {
            "type": "string",
            "enum": [
              "commission",
              "upfront",
              "both"
            ]
          },
          "compensationLabel": {
            "type": "string"
          },
          "featured": {
            "type": "boolean"
          },
          "storefrontCount": {
            "type": "integer"
          }
        }
      },
      "ListingListResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Listing"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer"
              },
              "offset": {
                "type": "integer"
              },
              "limit": {
                "type": "integer"
              },
              "hasMore": {
                "type": "boolean"
              }
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "correlationId": {
            "type": "string"
          }
        }
      },
      "ListingDetailResponse": {
        "type": "object",
        "properties": {
          "success": {
            "type": "boolean"
          },
          "data": {
            "$ref": "#/components/schemas/Listing"
          },
          "correlationId": {
            "type": "string"
          }
        }
      },
      "LicenseVerifyResponse": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "error": {
            "type": "string"
          },
          "entitlement": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "productId": {
                "type": "string"
              },
              "status": {
                "type": "string"
              },
              "tierId": {
                "type": "string"
              },
              "tierName": {
                "type": "string"
              },
              "billingInterval": {
                "type": "string"
              },
              "currentPeriodEnd": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        }
      }
    }
  },
  "externalDocs": {
    "description": "feat.press developer resources",
    "url": "https://www.feat.press/developers"
  }
}
