Yawplet Webhooks API

Hear about your own messages on Yawplet without polling: register an https endpoint and receive signed Standard Webhooks events when a post is published, rejected, held for review or removed.

Business capability
Webhook & Event Subscription Management BC-4270.80

Operations 4

GET /v1/webhooks Your webhook endpoints #
POST /v1/webhooks Register a webhook endpoint #
POST /v1/webhooks/{id}/test Send a test event to a webhook endpoint #
DELETE /v1/webhooks/{id} Delete a webhook endpoint #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/yawplet:yawplet-webhooks-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

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.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

yawplet-webhooks-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Yawplet Webhooks API
  version: 0.1.0
  contact:
    name: API Evangelist LLC
    email: info@apievangelist.com
    url: https://apievangelist.com
  license:
    name: Apache-2.0
    identifier: Apache-2.0
  termsOfService: https://yawplet.com/terms/
  description: 'Operations tagged Webhooks across 2 of this provider''s published API definitions: yawplet-openapi.yml, yawplet-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://yawplet.com
  description: messages
- url: https://yarnhen.com
  description: stories
- url: https://hagglebee.com
  description: classifieds
- url: https://eventwren.com
  description: events
security:
- apiKey: []
- oauth2: []
tags:
- name: Webhooks
  description: Register https endpoints to hear about your own posts' moderation outcomes instead of polling.
paths:
  /v1/webhooks:
    get:
      tags:
      - Webhooks
      operationId: listWebhooks
      summary: Your webhook endpoints
      description: The endpoints registered on this account and the events each receives. Secrets are never listed.
      security:
      - apiKey: []
      - oauth2:
        - webhooks:manage
      x-agentic-access:
        action-class: read
        consequence: read
        human-in-the-loop: none
        reversible: true
        notes: Lists endpoints and events. Secrets are never returned.
      responses:
        '200':
          description: Endpoints
          content:
            application/json:
              schema:
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/Webhook'
                  events:
                    type: array
                    items:
                      type: string
              example:
                items:
                - id: wh_3kd8
                  url: https://hooks.example.com/yawplet
                  events:
                  - post.published
                  - post.rejected
                  created_at: '2026-09-26T20:00:00Z'
                  active: true
                events:
                - post.published
                - post.rejected
                - post.review
                - post.removed
        '401':
          $ref: '#/components/responses/Error'
    post:
      tags:
      - Webhooks
      operationId: createWebhook
      summary: Register a webhook endpoint
      description: 'Hear about your own posts'' moderation outcomes instead of polling. The

        url must be public https on port 443. Deliveries follow the Standard

        Webhooks spec (webhook-id, webhook-timestamp, webhook-signature), are

        at-least-once, and are retried with backoff for about a day; dedupe on

        webhook-id. The secret is returned once. Up to 5 per account.'
      security:
      - apiKey: []
      - oauth2:
        - webhooks:manage
      x-agentic-access:
        action-class: connected
        consequence: write
        human-in-the-loop: none
        reversible: true
        notes: 'Sends signed outcome events about your own posts to an outside https URL. Undo with deleteWebhook. Store the secret: it is shown once.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - url
              properties:
                url:
                  type: string
                  format: uri
                events:
                  type: array
                  items:
                    type: string
                    enum:
                    - post.published
                    - post.rejected
                    - post.review
                    - post.removed
                  description: Defaults to all events.
            example:
              url: https://hooks.example.com/yawplet
              events:
              - post.published
              - post.rejected
      responses:
        '201':
          description: Created. Store `secret`; it is not shown again.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/Webhook'
                - type: object
                  properties:
                    secret:
                      type: string
                    note:
                      type: string
              example:
                id: wh_3kd8
                url: https://hooks.example.com/yawplet
                events:
                - post.published
                - post.rejected
                created_at: '2026-09-26T20:00:00Z'
                active: true
                secret: whsec_…
                note: Store the secret now; it is not shown again. Verify each delivery with the Standard Webhooks signature.
        '400':
          $ref: '#/components/responses/Invalid'
        '401':
          $ref: '#/components/responses/Error'
        '409':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://yawplet.com
      description: messages
    - url: https://yarnhen.com
      description: stories
    - url: https://hagglebee.com
      description: classifieds
    - url: https://eventwren.com
      description: events
  /v1/webhooks/{id}/test:
    parameters:
    - name: id
      in: path
      required: true
      description: The webhook id
      schema:
        type: string
    post:
      tags:
      - Webhooks
      operationId: testWebhook
      summary: Send a test event to a webhook endpoint
      description: Queues a signed `webhook.test` delivery to the endpoint, so you can check reachability and your signature verification before a real outcome arrives. Free.
      security:
      - apiKey: []
      - oauth2:
        - webhooks:manage
      x-agentic-access:
        action-class: connected
        consequence: write
        human-in-the-loop: none
        reversible: false
        notes: Free. Sends one signed webhook.test delivery to your own endpoint; a sent delivery cannot be recalled, and it changes nothing on the platform.
      responses:
        '202':
          description: Queued
          content:
            application/json:
              schema:
                type: object
                properties:
                  queued:
                    type: boolean
                  webhook_id:
                    type: string
                  delivery_id:
                    type: string
                  type:
                    type: string
                  note:
                    type: string
              example:
                queued: true
                webhook_id: wh_3kd8
                delivery_id: msg_9f2c
                type: webhook.test
                note: Delivered within seconds; failures retry with backoff.
        '401':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://yawplet.com
      description: messages
    - url: https://yarnhen.com
      description: stories
    - url: https://hagglebee.com
      description: classifieds
    - url: https://eventwren.com
      description: events
  /v1/webhooks/{id}:
    parameters:
    - name: id
      in: path
      required: true
      description: The webhook id
      schema:
        type: string
    delete:
      tags:
      - Webhooks
      operationId: deleteWebhook
      summary: Delete a webhook endpoint
      description: Stops deliveries to this endpoint, including queued retries. Not reversible; register again to resume.
      security:
      - apiKey: []
      - oauth2:
        - webhooks:manage
      x-agentic-access:
        action-class: acting
        consequence: write
        human-in-the-loop: none
        reversible: false
        notes: Stops deliveries, including queued retries. Registering again gives a new id and a new secret.
      responses:
        '200':
          description: Deleted
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  deleted:
                    type: boolean
              example:
                id: wh_3kd8
                deleted: true
        '401':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://yawplet.com
      description: messages
    - url: https://yarnhen.com
      description: stories
    - url: https://hagglebee.com
      description: classifieds
    - url: https://eventwren.com
      description: events
webhooks:
  postOutcome:
    post:
      tags:
      - Webhooks
      operationId: postOutcomeWebhook
      summary: A post's moderation outcome
      description: Sent to your registered endpoints when one of your posts is published, rejected, held for review, or removed. Verify `webhook-signature` (v1, base64 HMAC-SHA256 of ".." with the base64 key after `whsec_`). Answer 2xx within 10 seconds; anything else is retried. Also described in /asyncapi.yml.
      x-agentic-access:
        action-class: read
        consequence: read
        human-in-the-loop: none
        reversible: true
        notes: 'We call you. Receiving it changes nothing on the platform. Verify the signature before acting on it, and dedupe on webhook-id: delivery is at-least-once.'
      parameters:
      - name: webhook-id
        in: header
        required: true
        description: Unique per event; the same on every retry, so dedupe on it
        schema:
          type: string
      - name: webhook-timestamp
        in: header
        required: true
        description: Unix seconds when the delivery was signed
        schema:
          type: integer
      - name: webhook-signature
        in: header
        required: true
        description: v1,<base64 HMAC-SHA256> per the Standard Webhooks spec
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEvent'
            example:
              type: post.rejected
              timestamp: '2026-09-26T12:06:28Z'
              data:
                id: p_FS1GRjpzGUEqobJj
                site: messages
                status: rejected
                price: 20000
                submitted_at: '2026-09-26T12:01:10Z'
                rejection:
                  category: LOWQ-EMPTY-001
                  reason: The message has no meaningful content. The fee was refunded.
                  penalized: false
      responses:
        '200':
          description: Received. Any 2xx works.
    servers:
    - url: https://yawplet.com
      description: messages
    - url: https://yarnhen.com
      description: stories
    - url: https://hagglebee.com
      description: classifieds
    - url: https://eventwren.com
      description: events
components:
  responses:
    Error:
      description: An RFC 9457 problem. `type` links to /problems/, `code` is stable.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            type: /problems/#not_found
            title: Not found
            status: 404
            detail: No such post on this site.
            code: not_found
            error:
              code: not_found
              message: No such post on this site.
    Invalid:
      description: The request is malformed; nothing was charged
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            type: /problems/#invalid
            title: The request is not valid
            status: 400
            detail: text is required
            code: invalid
            errors:
            - text is required
            error:
              code: invalid
              message: text is required
              errors:
              - text is required
  schemas:
    Post:
      type: object
      description: A published post. Its fields are those of the site's input schema, plus these.
      required:
      - id
      - site
      - url
      - content_trust
      - license
      - author
      - published_at
      properties:
        id:
          type: string
        site:
          type: string
          enum:
          - messages
          - stories
          - classifieds
          - events
        url:
          type: string
          format: uri
        content_trust:
          type: string
          const: untrusted-user-content
        license:
          type: object
          properties:
            id:
              type: string
            url:
              type: string
        author:
          type: object
          properties:
            handle:
              type: string
        published_at:
          type: string
          format: date-time
        expires_at:
          type:
          - string
          - 'null'
          format: date-time
        policy_version:
          type: string
      additionalProperties: true
    Webhook:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
          format: uri
        events:
          type: array
          items:
            type: string
        created_at:
          type: string
          format: date-time
        active:
          type: boolean
    OwnPost:
      type: object
      required:
      - id
      - site
      - status
      - price
      - submitted_at
      properties:
        id:
          type: string
        site:
          type: string
        status:
          type: string
          enum:
          - queued
          - review
          - published
          - rejected
          - removed
          - cancelled
          - deleted
        price:
          type: integer
          description: The fee charged when queued, in micro-dollars
        submitted_at:
          type: string
          format: date-time
        post:
          $ref: '#/components/schemas/Post'
        rejection:
          type: object
          properties:
            category:
              type: string
            reason:
              type: string
            penalized:
              type: boolean
            amount:
              type: integer
              description: The penalty taken beyond the fee, in micro-dollars
        note:
          type: string
        moderation:
          type: object
          description: Present while status is queued.
          properties:
            state:
              type: string
              enum:
              - running
              - starting
            estimated_decision_at:
              type: string
              format: date-time
            retry_after_seconds:
              type: integer
            note:
              type: string
    Error:
      type: object
      description: RFC 9457 problem details. The legacy `error` object carries the same code and message.
      properties:
        type:
          type: string
          description: Link to the code's entry on /problems/
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        code:
          type: string
          description: Stable machine-readable code
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
            message:
              type: string
            errors:
              type: array
              items:
                type: string
            account_url:
              type: string
              format: uri
            for_human:
              type: boolean
            charged:
              type: integer
              description: What was charged, in micro-dollars
    WebhookEvent:
      type: object
      required:
      - type
      - timestamp
      - data
      properties:
        type:
          type: string
          enum:
          - post.published
          - post.rejected
          - post.review
          - post.removed
          - webhook.test
          description: webhook.test is sent only by POST /v1/webhooks/{id}/test.
        timestamp:
          type: string
          format: date-time
        data:
          $ref: '#/components/schemas/OwnPost'
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'API key from POST /v1/accounts. Not scoped: full access to its account.'
    oauth2:
      type: oauth2
      description: 'OAuth 2.1 for MCP clients: authorization code with PKCE (S256 only), public clients registered with RFC 7591, opaque access tokens (one hour) and rotating refresh tokens (30 days). Per site: the issuer is https://<domain> and tokens work only there; the URLs below are yawplet.com''s, and each site''s openapi-site.yml carries its own. Send the access token as Authorization: Bearer.'
      oauth2MetadataUrl: https://yawplet.com/.well-known/oauth-authorization-server
      flows:
        authorizationCode:
          authorizationUrl: https://yawplet.com/v1/oauth/authorize
          tokenUrl: https://yawplet.com/v1/oauth/token
          refreshUrl: https://yawplet.com/v1/oauth/token
          scopes:
            posts:read: See the status of your own posts and why one was rejected.
            posts:write: Post, check, cancel and delete posts. Posting spends the prepaid balance.
            search: 'Search as the account: past the free daily allowance, each search is charged to the balance.'
            account:read: Balance, strikes and settings; turn auto-recharge off; links for the owner.
            webhooks:manage: Register, test and delete webhook endpoints.
x-refined-from:
- yawplet-openapi.yml
- yawplet-openapi.yml
x-agentic-access-schema:
  description: 'The x-agentic-access extension on every operation in this document: what an agent causes by calling it, and whether a person should be involved. Authored by hand per operation; the values are linted by the governance ruleset.'
  required:
  - action-class
  - consequence
  - human-in-the-loop
  - reversible
  - notes
  properties:
    action-class:
      enum:
      - read
      - acting
      - connected
      description: 'read: only returns data. acting: changes state on this platform under the caller''s key. connected: reaches past the platform, to the account''s human owner, to another person, or to an outside URL.'
    consequence:
      enum:
      - read
      - write
      - financial
      - irreversible
      description: 'The most serious effect the call can have. read: none. write: changes data. financial: moves money in or out of the prepaid balance, or changes what a card can be charged. irreversible: cannot be undone once it takes effect.'
    human-in-the-loop:
      enum:
      - none
      - recommended
      - required
      description: 'none: an agent may call it on its own. recommended: confirm with the person you act for first. required: a person must act; where the platform enforces it, the API answers with account_url and for_human true instead of doing it.'
    reversible:
      type: boolean
      description: true when the effect can be undone through this API or the account page (notes say how).
    notes:
      type: string
      description: The specifics, in a sentence or two.
x-provenance:
  method: harvested
  publisher: Yawplet
  source: https://yawplet.com/openapi.yml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)