PersonalBusinessEnterprise
    In a rush? Schedule an Appointment
    Fetching local time...
    Anytime CapitalforBusiness
    Pricing

    Get started

    • Overview
    • Quickstart
    • Test mode
    • Guides & recipes
    • Switch from Stripe
    • Import from Shopify
    • Import from WooCommerce
    • Import from Square
    • Import a CSV file
    • Stripe API mapping
    • Pricing
    • Support
    • FAQ

    Payments

    • Checkout & website
    • Guide: Next.js checkout
    • In person (QR)
    • Payment methods
    • Stablecoin checkout
    • Guide: take stablecoins
    • Fraud rules & 3D Secure
    • Dispute evidence
    • International customers
    • Guide: safe refunds
    • Bank transfers on invoices

    Billing

    • Subscription discounts
    • Guide: sell subscriptions
    • Usage billing
    • Guide: report usage

    Money movement

    • Payout options
    • Guide: reconcile payouts
    • Accounting sync
    • Revenue analytics

    Developers

    • Authentication
    • Errors & retries
    • Pagination
    • Idempotency
    • Rate limits
    • Webhooks
    • Verify webhooks
    • Node SDK (preview)
    • CLI (preview)
    • Postman collection

    AI

    • AI agents hub
    • Safe AI agents
    • Custom agents
    • Prompt library

    Integrations

    • Website builders
    • Shopify
    • Shopify orders by invoice
    • WooCommerce
    • Zapier
    • Slack, Discord and Teams

    Reference

    • Payments
    • Refunds
    • Disputes
    • Payment links
    • Invoices
    • Customers
    • Products
    • Subscriptions & plans
    • Discount codes
    • Meters & usage events
    • Payouts & balance
    • Webhook endpoints
    • Events
    • Test helpers
    • OpenAPI spec
    • Error codes
    • Changelog
    • Glossary

    For AI tools

    • llms-full.txt
    • MCP server
    • openapi.json
    Docs menu · Webhook endpoints

    Get started

    • Overview
    • Quickstart
    • Test mode
    • Guides & recipes
    • Switch from Stripe
    • Import from Shopify
    • Import from WooCommerce
    • Import from Square
    • Import a CSV file
    • Stripe API mapping
    • Pricing
    • Support
    • FAQ

    Payments

    • Checkout & website
    • Guide: Next.js checkout
    • In person (QR)
    • Payment methods
    • Stablecoin checkout
    • Guide: take stablecoins
    • Fraud rules & 3D Secure
    • Dispute evidence
    • International customers
    • Guide: safe refunds
    • Bank transfers on invoices

    Billing

    • Subscription discounts
    • Guide: sell subscriptions
    • Usage billing
    • Guide: report usage

    Money movement

    • Payout options
    • Guide: reconcile payouts
    • Accounting sync
    • Revenue analytics

    Developers

    • Authentication
    • Errors & retries
    • Pagination
    • Idempotency
    • Rate limits
    • Webhooks
    • Verify webhooks
    • Node SDK (preview)
    • CLI (preview)
    • Postman collection

    AI

    • AI agents hub
    • Safe AI agents
    • Custom agents
    • Prompt library

    Integrations

    • Website builders
    • Shopify
    • Shopify orders by invoice
    • WooCommerce
    • Zapier
    • Slack, Discord and Teams

    Reference

    • Payments
    • Refunds
    • Disputes
    • Payment links
    • Invoices
    • Customers
    • Products
    • Subscriptions & plans
    • Discount codes
    • Meters & usage events
    • Payouts & balance
    • Webhook endpoints
    • Events
    • Test helpers
    • OpenAPI spec
    • Error codes
    • Changelog
    • Glossary

    For AI tools

    • llms-full.txt
    • MCP server
    • openapi.json
    DocsReferenceWebhook endpoints

    Webhook endpoints API

    Subscribe and unsubscribe webhook URLs from your own code with the Anytime Capital Payments API, REST-hook style, and get each endpoint's signing secret.

    View as MarkdownOpen in Claude

    Where we send your events, managed from your own code: subscribe with POST, unsubscribe with DELETE, the REST-hook style automation tools use. The rules are the dashboard's: an https:// URL on a public domain name (no IP addresses or localhost), known event types or ["*"] for every event including ones added later, and at most 10 endpoints per business. Endpoints made here also show in Settings → Developers.

    TopicDetail
    Endpoints`POST /api/v1/webhook-endpoints`, `GET /api/v1/webhook-endpoints`, `GET /api/v1/webhook-endpoints/{id}`, `PATCH /api/v1/webhook-endpoints/{id}`, `DELETE /api/v1/webhook-endpoints/{id}`
    Key permissionswebhook_endpoints:write, webhook_endpoints:read
    Samplescurl; Node.js 18+ with the built-in fetch (in an ES module); the Node SDK (preview: not on npm yet); Python with requests.
    Every request can also answer401 UNAUTHORIZED, 401 API_KEY_EXPIRED, 403 NOT_ENROLLED, 403 PERMISSION_DENIED, 403 IP_NOT_ALLOWED, 429 RATE_LIMITED, 500 INTERNAL_ERROR. See Error codes.

    Store the secret when you create it

    The signing secret (whsec_…) is in the create response only: read it from secret, keep it in a server-side secret store, and use it to verify every event. A retry of the create with the same Idempotency-Key returns the endpoint again with its secret.

    The webhook endpoint object

    JSON
    {
      "object": "webhook_endpoint",
      "livemode": true,
      "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      "url": "https://example.com/webhooks/anytime",
      "events": [
        "payment.succeeded",
        "refund.created"
      ],
      "description": "Order fulfilment",
      "enabled": true,
      "createdAt": "2026-10-24T10:00:00.000Z"
    }
    FieldTypeDescription
    objectstringThe type of object. Always webhook_endpoint.
    livemodebooleanFalse for test-mode data (an ak_test_ key); true for live data.
    idstringwe_ followed by 20 letters and digits.
    urlstring (uri)Where events are sent.
    eventsstring[]Event types, or ["*"] for every event.
    descriptionstring or nullYour note.
    enabledbooleanReceiving events.
    createdAtstring (date-time)Created.

    Endpoints

    Create a webhook endpoint

    POST/api/v1/webhook-endpoints
    Permission webhook_endpoints:writeSupports Idempotency-Key.

    Subscribe a URL to events (REST hooks subscribe here). The signing secret is in this response only. Store secret now: it's in this response only. A retry with the same Idempotency-Key returns the endpoint with its current secret.

    Headers

    Idempotency-Key
    string
    Recommended. A unique key such as a UUID: a retry with the same key within 24 hours gets the first response back instead of acting twice. See Idempotency.

    Body

    url
    string (uri)required
    An https:// URL on a public domain name (no IP addresses or localhost). Up to 500 characters.
    events
    string[]required
    Event types to receive, or ["*"] for every event including ones added later. 1–26 items.
    description
    string or null
    Your note. Up to 200 characters.
    Request
    curl -X POST https://anytime-capital.com/api/v1/webhook-endpoints \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: endpoint-orders" \
      -H "Content-Type: application/json" \
      -d '{
        "url": "https://example.com/webhooks/anytime",
        "events": [
          "payment.succeeded",
          "refund.created"
        ],
        "description": "Order fulfilment"
      }'
    const res = await fetch("https://anytime-capital.com/api/v1/webhook-endpoints", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": "endpoint-orders",
      },
      body: JSON.stringify({
        url: "https://example.com/webhooks/anytime",
        events: ["payment.succeeded", "refund.created"],
        description: "Order fulfilment",
      }),
    });
    const endpoint = await res.json();
    if (!res.ok) throw new Error(`${endpoint.error.code}: ${endpoint.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const endpoint = await client.webhookEndpoints.create(
      {
        url: "https://example.com/webhooks/anytime",
        events: ["payment.succeeded", "refund.created"],
        description: "Order fulfilment",
      },
      { idempotencyKey: "endpoint-orders" },
    );
    import os
    
    import requests
    
    res = requests.post(
        "https://anytime-capital.com/api/v1/webhook-endpoints",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "endpoint-orders",
        },
        json={
            "url": "https://example.com/webhooks/anytime",
            "events": ["payment.succeeded", "refund.created"],
            "description": "Order fulfilment",
        },
        timeout=30,
    )
    endpoint = res.json()
    if not res.ok:
        raise RuntimeError(f"{endpoint['error']['code']}: {endpoint['error']['message']}")
    Response 201
    {
      "object": "webhook_endpoint",
      "livemode": true,
      "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      "url": "https://example.com/webhooks/anytime",
      "events": [
        "payment.succeeded",
        "refund.created"
      ],
      "description": "Order fulfilment",
      "enabled": true,
      "createdAt": "2026-10-24T10:00:00.000Z",
      "secret": "whsec_…"
    }

    Errors

    400INVALID_JSON
    The body isn't valid JSON, or couldn't be read. An empty body reads as {}. Send Content-Type: application/json and a JSON object.
    400INVALID_INPUT
    A field, filter, limit or cursor is missing or invalid. The message starts with the field's name, as in amountCents: …, or reads Invalid cursor. Fix the named field. Don't retry the same request unchanged.
    400INVALID_IDEMPOTENCY_KEY
    The Idempotency-Key header is empty, longer than 255 characters, or has characters other than printable ASCII. Use a UUID. See Idempotency.
    409LIMIT_REACHED
    The business already has 10 webhook endpoints. Delete one you no longer use with DELETE /api/v1/webhook-endpoints/{id}.
    422IDEMPOTENCY_KEY_REUSED
    The Idempotency-Key was used in the last 24 hours with a different body or endpoint. Use a new key for a new request; reuse a key only to retry the same request.
    503NOT_CONFIGURED
    The part of Anytime Capital Payments this needs isn't available right now. Retry later, with the same Idempotency-Key on a write.

    List webhook endpoints

    GET/api/v1/webhook-endpoints
    Permission webhook_endpoints:read

    Every endpoint (at most 10), oldest first, in one page.

    Request
    curl https://anytime-capital.com/api/v1/webhook-endpoints \
      -H "Authorization: Bearer $ANYTIME_API_KEY"
    const res = await fetch("https://anytime-capital.com/api/v1/webhook-endpoints", {
      headers: { Authorization: `Bearer ${process.env.ANYTIME_API_KEY}` },
    });
    const page = await res.json();
    if (!res.ok) throw new Error(`${page.error.code}: ${page.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const page = await client.webhookEndpoints.list();
    import os
    
    import requests
    
    res = requests.get(
        "https://anytime-capital.com/api/v1/webhook-endpoints",
        headers={"Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}"},
        timeout=30,
    )
    page = res.json()
    if not res.ok:
        raise RuntimeError(f"{page['error']['code']}: {page['error']['message']}")
    Response 200
    {
      "object": "list",
      "data": [
        {
          "object": "webhook_endpoint",
          "livemode": true,
          "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
          "url": "https://example.com/webhooks/anytime",
          "events": [
            "payment.succeeded",
            "refund.created"
          ],
          "description": "Order fulfilment",
          "enabled": true,
          "createdAt": "2026-10-24T10:00:00.000Z"
        }
      ],
      "hasMore": false,
      "nextCursor": null
    }

    Get a webhook endpoint

    GET/api/v1/webhook-endpoints/{id}
    Permission webhook_endpoints:read

    One endpoint (never its secret).

    Path

    id
    stringrequired
    we_…
    Request
    curl https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8 \
      -H "Authorization: Bearer $ANYTIME_API_KEY"
    const res = await fetch("https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8", {
      headers: { Authorization: `Bearer ${process.env.ANYTIME_API_KEY}` },
    });
    const endpoint = await res.json();
    if (!res.ok) throw new Error(`${endpoint.error.code}: ${endpoint.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const endpoint = await client.webhookEndpoints.retrieve("we_Rt2Vb7Nc4Zp9WkLm3Qx8");
    import os
    
    import requests
    
    res = requests.get(
        "https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8",
        headers={"Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}"},
        timeout=30,
    )
    endpoint = res.json()
    if not res.ok:
        raise RuntimeError(f"{endpoint['error']['code']}: {endpoint['error']['message']}")
    Response 200
    {
      "object": "webhook_endpoint",
      "livemode": true,
      "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      "url": "https://example.com/webhooks/anytime",
      "events": [
        "payment.succeeded",
        "refund.created"
      ],
      "description": "Order fulfilment",
      "enabled": true,
      "createdAt": "2026-10-24T10:00:00.000Z"
    }

    Errors

    404NOT_FOUND
    No such object on your business (an id from another business reads the same), or no such endpoint under /api/v1, which still answers in JSON. Check the id and the path. Ids are case-sensitive.

    Update a webhook endpoint

    PATCH/api/v1/webhook-endpoints/{id}
    Permission webhook_endpoints:writeSupports Idempotency-Key.

    Change url, events or description, or switch it off and on.

    Path

    id
    stringrequired
    we_…

    Headers

    Idempotency-Key
    string
    Recommended. A unique key such as a UUID: a retry with the same key within 24 hours gets the first response back instead of acting twice. See Idempotency.

    Body

    url
    string (uri)
    An https:// URL on a public domain name (no IP addresses or localhost). Up to 500 characters.
    events
    string[]
    Event types to receive, or ["*"] for every event including ones added later. 1–26 items.
    description
    string or null
    Your note; null clears it. Up to 200 characters.
    enabled
    boolean
    false switches it off (events waiting are dropped); true back on (new events only).
    Request
    curl -X PATCH https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8 \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: endpoint-orders-all-events" \
      -H "Content-Type: application/json" \
      -d '{
        "events": [
          "*"
        ]
      }'
    const res = await fetch("https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8", {
      method: "PATCH",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": "endpoint-orders-all-events",
      },
      body: JSON.stringify({ events: ["*"] }),
    });
    const endpoint = await res.json();
    if (!res.ok) throw new Error(`${endpoint.error.code}: ${endpoint.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const endpoint = await client.webhookEndpoints.update(
      "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      { events: ["*"] },
      { idempotencyKey: "endpoint-orders-all-events" },
    );
    import os
    
    import requests
    
    res = requests.patch(
        "https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "endpoint-orders-all-events",
        },
        json={"events": ["*"]},
        timeout=30,
    )
    endpoint = res.json()
    if not res.ok:
        raise RuntimeError(f"{endpoint['error']['code']}: {endpoint['error']['message']}")
    Response 200
    {
      "object": "webhook_endpoint",
      "livemode": true,
      "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      "url": "https://example.com/webhooks/anytime",
      "events": [
        "*"
      ],
      "description": "Order fulfilment",
      "enabled": true,
      "createdAt": "2026-10-24T10:00:00.000Z"
    }

    Errors

    400INVALID_JSON
    The body isn't valid JSON, or couldn't be read. An empty body reads as {}. Send Content-Type: application/json and a JSON object.
    400INVALID_INPUT
    A field, filter, limit or cursor is missing or invalid. The message starts with the field's name, as in amountCents: …, or reads Invalid cursor. Fix the named field. Don't retry the same request unchanged.
    400INVALID_IDEMPOTENCY_KEY
    The Idempotency-Key header is empty, longer than 255 characters, or has characters other than printable ASCII. Use a UUID. See Idempotency.
    404NOT_FOUND
    No such object on your business (an id from another business reads the same), or no such endpoint under /api/v1, which still answers in JSON. Check the id and the path. Ids are case-sensitive.
    422IDEMPOTENCY_KEY_REUSED
    The Idempotency-Key was used in the last 24 hours with a different body or endpoint. Use a new key for a new request; reuse a key only to retry the same request.

    Delete a webhook endpoint

    DELETE/api/v1/webhook-endpoints/{id}
    Permission webhook_endpoints:writeSupports Idempotency-Key.

    Remove it and its delivery log (REST hooks unsubscribe here). Events stop at once. Without an Idempotency-Key, deleting it again answers 404.

    Path

    id
    stringrequired
    we_…

    Headers

    Idempotency-Key
    string
    Recommended. A unique key such as a UUID: a retry with the same key within 24 hours gets the first response back instead of acting twice. See Idempotency.
    Request
    curl -X DELETE https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8 \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: endpoint-orders-delete"
    const res = await fetch("https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8", {
      method: "DELETE",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Idempotency-Key": "endpoint-orders-delete",
      },
    });
    const deleted = await res.json();
    if (!res.ok) throw new Error(`${deleted.error.code}: ${deleted.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const deleted = await client.webhookEndpoints.del(
      "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      { idempotencyKey: "endpoint-orders-delete" },
    );
    import os
    
    import requests
    
    res = requests.delete(
        "https://anytime-capital.com/api/v1/webhook-endpoints/we_Rt2Vb7Nc4Zp9WkLm3Qx8",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "endpoint-orders-delete",
        },
        timeout=30,
    )
    deleted = res.json()
    if not res.ok:
        raise RuntimeError(f"{deleted['error']['code']}: {deleted['error']['message']}")
    Response 200
    {
      "object": "webhook_endpoint",
      "id": "we_Rt2Vb7Nc4Zp9WkLm3Qx8",
      "deleted": true
    }

    Errors

    400INVALID_IDEMPOTENCY_KEY
    The Idempotency-Key header is empty, longer than 255 characters, or has characters other than printable ASCII. Use a UUID. See Idempotency.
    404NOT_FOUND
    No such object on your business (an id from another business reads the same), or no such endpoint under /api/v1, which still answers in JSON. Check the id and the path. Ids are case-sensitive.
    422IDEMPOTENCY_KEY_REUSED
    The Idempotency-Key was used in the last 24 hours with a different body or endpoint. Use a new key for a new request; reuse a key only to retry the same request.
    PreviousPayouts & balanceNext Events

    Anytime Capital is a fintech company, not a bank. Payment processing, banking and payout services are provided by Anytime Capital's licensed partners. Rates shown are for US card payments; international cards, currency conversion and disputes may carry additional fees shown in your dashboard before you accept a payment.

    On this page

    • The webhook endpoint object
    • Endpoints
    • Create a webhook endpoint
    • List webhook endpoints
    • Get a webhook endpoint
    • Update a webhook endpoint
    • Delete a webhook endpoint
    Anytime Capital
    (470) 748-2530
    App Store

    Business

    • Business Checking
    • Business Debit Cards
    • Payments
    • Ecommerce Payments
    • Invoicing
    • Developer Docs

    Solutions

    • CPAs & Accountants
    • Financial Advisors
    • Boat & Auto Dealerships
    • Dental & Medical Practices
    • Creators & Coaches
    • All solutions

    Crypto

    • Crypto Wallet
    • Tether Wallet
    • Buy Digital Assets
    • Explore Markets
    • Security & Licenses
    • Compare Platforms
    • Bitcoin ATM Alternative

    Company

    • Our Story
    • Schedule Appointment
    • Careers
    • Media & Press
    • Investor Relations
    • FAQ

    Branches

    • Atlanta, Georgia
    • Miami, Florida
    • Houston, Texas
    • All branches

    Legal

    • Terms & Conditions
    • Privacy Policy
    • Your Privacy Choices
    • Fraud Notice

    © 2026 Anytime Capital LLC. Anytime Capital is a fintech company, not a bank.

    The Anytime Capital Mastercard® Prepaid Card is issued by Pathward®, N.A., Member FDIC. Mastercard® is a registered trademark of Mastercard International Incorporated. All other trademarks and service marks belong to their respective owners.

    Mastercard