AsyncAPI 2.6 description of Ko-fi's **only** documented developer surface: an **outbound payment webhook**. Ko-fi does **not** publish a public REST API. There is no request/response endpoint to read, create, update, or delete donations, members, orders, or commissions. The single integration point is a webhook you enable on your Ko-fi webhooks page (https://ko-fi.com/manage/webhooks): whenever a payment happens, Ko-fi's servers send an HTTP `POST` to the URL you configured. Transport details (from https://help.ko-fi.com/hc/en-us/articles/360004162298-Does-Ko-fi-have-an-API-or-webhook): - It is a normal **HTTP POST**, one-way from Ko-fi to your endpoint. It is **not** WebSocket and **not** Server-Sent Events. - The request `Content-Type` is `application/x-www-form-urlencoded`. The body carries a single form field named `data` whose value is a **JSON string**. - The JSON includes a `verification_token` (a private token shown on your Ko-fi webhooks page). Your endpoint should compare it to your stored token and reject the request if it does not match. - A top-level `type` field identifies the event: `Donation`, `Subscription`, `Shop Order`, or `Commission`. - The webhook fires **only when a payment is made**. Ko-fi documents that it cannot, for example, notify you when a membership ends - only when a membership payment occurs. Because Ko-fi POSTs to *your* server, there is no Ko-fi-hosted base URL for this API; the "server" below is a placeholder for the consumer-operated endpoint that receives the webhook.
View SpecView on GitHubCreator EconomyDonationsTipsMembershipsShopPaymentsWebhookCreator MonetizationAsyncAPIEventsWebhooks
Channels
ko-fi/payment
subscribereceiveKoFiPayment
Receive a Ko-fi payment notification.
Payment webhook channel. Ko-fi issues an HTTP POST to your configured URL when a payment occurs. The POST is `application/x-www-form-urlencoded` with a single `data` field whose value is a JSON string. The `type` field inside that JSON selects one of the message variants below. Your service "subscribes" (receives) these events; Ko-fi is the publisher.
Messages
✉
Donation
Donation / Tip
A one-off tip or donation to your Ko-fi page.
✉
Subscription
Subscription / Membership Payment
A recurring membership payment. Fires on each payment, including the first.
✉
ShopOrder
Shop Order
A purchase from your Ko-fi Shop. Includes shop_items and, for physical goods, shipping.
✉
Commission
Commission
A paid commission request. Ko-fi documents Commission as a webhook type but does not publish an example payload; it follows the same base shape as other payment events.
Servers
https
consumer-endpoint{yourWebhookUrl}
The HTTPS URL you register on https://ko-fi.com/manage/webhooks. Ko-fi POSTs payment notifications here. This is operated by you (the Ko-fi creator / integrator), not by Ko-fi.
asyncapi: '2.6.0'
id: 'urn:com:ko-fi:webhook'
info:
title: Ko-fi Payment Webhook (Outbound HTTP POST)
version: '1.0.0'
description: |
AsyncAPI 2.6 description of Ko-fi's **only** documented developer surface:
an **outbound payment webhook**.
Ko-fi does **not** publish a public REST API. There is no request/response
endpoint to read, create, update, or delete donations, members, orders, or
commissions. The single integration point is a webhook you enable on your
Ko-fi webhooks page (https://ko-fi.com/manage/webhooks): whenever a payment
happens, Ko-fi's servers send an HTTP `POST` to the URL you configured.
Transport details (from
https://help.ko-fi.com/hc/en-us/articles/360004162298-Does-Ko-fi-have-an-API-or-webhook):
- It is a normal **HTTP POST**, one-way from Ko-fi to your endpoint. It is
**not** WebSocket and **not** Server-Sent Events.
- The request `Content-Type` is `application/x-www-form-urlencoded`. The body
carries a single form field named `data` whose value is a **JSON string**.
- The JSON includes a `verification_token` (a private token shown on your
Ko-fi webhooks page). Your endpoint should compare it to your stored token
and reject the request if it does not match.
- A top-level `type` field identifies the event: `Donation`, `Subscription`,
`Shop Order`, or `Commission`.
- The webhook fires **only when a payment is made**. Ko-fi documents that it
cannot, for example, notify you when a membership ends - only when a
membership payment occurs.
Because Ko-fi POSTs to *your* server, there is no Ko-fi-hosted base URL for
this API; the "server" below is a placeholder for the consumer-operated
endpoint that receives the webhook.
contact:
name: API Evangelist
email: kin@apievangelist.com
url: https://apievangelist.com
license:
name: API documentation - Ko-fi Terms
url: https://ko-fi.com/terms
x-transport-notes:
transport: HTTP Webhook (outbound POST)
protocol: https
direction: server-to-endpoint (one-way, Ko-fi to your URL)
contentType: application/x-www-form-urlencoded
bodyField: data
bodyEncoding: JSON string inside the "data" form field
verification: verification_token field must match the token on your Ko-fi webhooks page
firesOn: a payment event only (tip/donation, membership payment, shop order, commission)
notWebSocket: true
notSSE: true
source: https://help.ko-fi.com/hc/en-us/articles/360004162298-Does-Ko-fi-have-an-API-or-webhook
defaultContentType: application/x-www-form-urlencoded
servers:
consumer-endpoint:
url: '{yourWebhookUrl}'
protocol: https
description: |
The HTTPS URL you register on https://ko-fi.com/manage/webhooks. Ko-fi
POSTs payment notifications here. This is operated by you (the Ko-fi
creator / integrator), not by Ko-fi.
variables:
yourWebhookUrl:
description: Your publicly reachable HTTPS endpoint that receives Ko-fi webhook POSTs.
default: https://your-domain.example/ko-fi/webhook
channels:
ko-fi/payment:
description: |
Payment webhook channel. Ko-fi issues an HTTP POST to your configured URL
when a payment occurs. The POST is `application/x-www-form-urlencoded`
with a single `data` field whose value is a JSON string. The `type` field
inside that JSON selects one of the message variants below. Your service
"subscribes" (receives) these events; Ko-fi is the publisher.
bindings:
http:
type: request
method: POST
bindingVersion: '0.3.0'
subscribe:
operationId: receiveKoFiPayment
summary: Receive a Ko-fi payment notification.
description: |
Invoked by Ko-fi when a payment happens. Validate `verification_token`,
then branch on `type`.
message:
oneOf:
- $ref: '#/components/messages/Donation'
- $ref: '#/components/messages/Subscription'
- $ref: '#/components/messages/ShopOrder'
- $ref: '#/components/messages/Commission'
components:
messages:
Donation:
name: Donation
title: Donation / Tip
summary: A one-off tip or donation to your Ko-fi page.
contentType: application/json
payload:
$ref: '#/components/schemas/KoFiPayment'
examples:
- name: donation
payload:
verification_token: 00000000-0000-0000-0000-000000000000
message_id: 3a1fac0c-f960-4506-a60e-824979a74e74
timestamp: '2026-07-05T14:22:31Z'
type: Donation
is_public: true
from_name: Jo Example
message: Great work!
amount: '5.00'
url: https://ko-fi.com/Home/CoffeeShop?txid=00000000-1111-2222-3333-444444444444
email: jo@example.com
currency: USD
is_subscription_payment: false
is_first_subscription_payment: false
kofi_transaction_id: 00000000-1111-2222-3333-444444444444
tier_name: null
shop_items: null
shipping: null
Subscription:
name: Subscription
title: Subscription / Membership Payment
summary: A recurring membership payment. Fires on each payment, including the first.
contentType: application/json
payload:
$ref: '#/components/schemas/KoFiPayment'
examples:
- name: subscription
payload:
verification_token: 00000000-0000-0000-0000-000000000000
message_id: 41d4a12e-9b3a-4b1e-8d0f-2c7e5b6a1234
timestamp: '2026-07-05T14:25:10Z'
type: Subscription
is_public: true
from_name: Sam Member
message: null
amount: '6.00'
url: https://ko-fi.com/Home/CoffeeShop?txid=55555555-6666-7777-8888-999999999999
email: sam@example.com
currency: USD
is_subscription_payment: true
is_first_subscription_payment: true
kofi_transaction_id: 55555555-6666-7777-8888-999999999999
tier_name: Gold Tier
shop_items: null
shipping: null
ShopOrder:
name: ShopOrder
title: Shop Order
summary: A purchase from your Ko-fi Shop. Includes shop_items and, for physical goods, shipping.
contentType: application/json
payload:
$ref: '#/components/schemas/KoFiPayment'
examples:
- name: shop-order
payload:
verification_token: 00000000-0000-0000-0000-000000000000
message_id: 8f2b6c11-77aa-4c33-9b21-abcabcabcabc
timestamp: '2026-07-05T14:30:00Z'
type: Shop Order
is_public: true
from_name: Pat Buyer
message: null
amount: '25.00'
url: https://ko-fi.com/Home/CoffeeShop?txid=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
email: pat@example.com
currency: USD
is_subscription_payment: false
is_first_subscription_payment: false
kofi_transaction_id: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
tier_name: null
shop_items:
- direct_link_code: b1e2c3d4e5
variation_name: Large
quantity: 1
shipping:
full_name: Pat Buyer
street_address: 123 Example St
city: Anytown
state_or_province: CA
postal_code: '90000'
country: United States
country_code: US
telephone: '+1-555-0100'
Commission:
name: Commission
title: Commission
summary: >-
A paid commission request. Ko-fi documents Commission as a webhook type
but does not publish an example payload; it follows the same base shape
as other payment events.
contentType: application/json
payload:
$ref: '#/components/schemas/KoFiPayment'
schemas:
KoFiPayment:
type: object
description: >-
The JSON object carried in the form-encoded "data" field of every Ko-fi
payment webhook POST. Field presence varies by event type (for example,
shop_items and shipping are populated only for Shop Orders; tier_name
only for memberships).
required:
- verification_token
- message_id
- timestamp
- type
- amount
- currency
- kofi_transaction_id
properties:
verification_token:
type: string
description: Private token shown on your Ko-fi webhooks page; compare to reject spoofed requests.
message_id:
type: string
description: Unique identifier for this webhook message.
timestamp:
type: string
format: date-time
description: When the payment occurred.
type:
type: string
enum:
- Donation
- Subscription
- Shop Order
- Commission
description: The kind of payment event.
is_public:
type: boolean
description: Whether the supporter chose to make the message public.
from_name:
type: string
description: Display name of the supporter (or 'Anonymous').
message:
type: string
description: Optional message left by the supporter. May be null.
amount:
type: string
description: Payment amount as a decimal string, e.g. "5.00".
url:
type: string
format: uri
description: Link to the transaction on Ko-fi.
email:
type: string
format: email
description: Supporter email (present when shared with the creator).
currency:
type: string
description: ISO 4217 currency code, e.g. USD, GBP, EUR.
is_subscription_payment:
type: boolean
description: True when the payment is a recurring membership payment.
is_first_subscription_payment:
type: boolean
description: True only on the first payment of a new membership.
kofi_transaction_id:
type: string
description: Ko-fi's unique transaction identifier.
tier_name:
type: string
description: Membership tier name for subscription payments; null otherwise.
shop_items:
type: array
description: Items purchased for a Shop Order; null for non-shop events.
items:
type: object
properties:
direct_link_code:
type: string
description: Code identifying the purchased shop item.
variation_name:
type: string
description: Selected product variation, if any.
quantity:
type: integer
description: Quantity purchased.
shipping:
type: object
description: Shipping address for physical Shop Orders; null otherwise.
properties:
full_name:
type: string
street_address:
type: string
city:
type: string
state_or_province:
type: string
postal_code:
type: string
country:
type: string
country_code:
type: string
telephone:
type: string
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.