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 · Products

    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
    DocsReferenceProducts

    Products API

    Manage your product catalog with the Anytime Capital Payments API: create products with a price, SKU and shipping flag, update them and archive them.

    View as MarkdownOpen in Claude

    Your product catalog (the Products page): what you sell, with a price, an optional SKU and whether it ships. Products are archived, never deleted, so payment links and receipts that used one keep its name. Images are added in the dashboard, and links that sell products are built there too: the API's payment links take a single price.

    TopicDetail
    Endpoints`POST /api/v1/products`, `GET /api/v1/products`, `GET /api/v1/products/{id}`, `PATCH /api/v1/products/{id}`, `POST /api/v1/products/{id}/archive`
    Key permissionsproducts:write, products: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.

    The product object

    JSON
    {
      "object": "product",
      "livemode": true,
      "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      "name": "Ceramic mug",
      "description": "Hand-glazed, 12 oz.",
      "priceCents": 1800,
      "currency": "usd",
      "sku": "MUG-12",
      "physical": true,
      "imageUrl": null,
      "active": true,
      "createdAt": "2026-10-02T10:00:00.000Z",
      "archivedAt": null
    }
    FieldTypeDescription
    objectstringThe type of object. Always product.
    livemodebooleanFalse for test-mode data (an ak_test_ key); true for live data.
    idstringprod_ followed by 20 letters and digits.
    namestringName.
    descriptionstring or nullDescription.
    priceCentsintegerPrice. Integer cents.
    currencystringusd.
    skustring or nullSKU.
    physicalbooleanShips: checkout asks for a shipping address.
    imageUrlstring (uri) or nullImage, while it has one and isn't archived.
    activebooleanNot archived.
    createdAtstring (date-time)Added.
    archivedAtstring (date-time) or nullArchived.

    Endpoints

    Create a product

    POST/api/v1/products
    Permission products:writeSupports Idempotency-Key.

    Add a product to the catalog. Images are added in the dashboard.

    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

    name
    stringrequired
    Name. Up to 120 characters.
    description
    string or null
    Description. Up to 1000 characters.
    priceCents
    integerrequired
    Price in cents. From 1 ($0.01) to 10,000,000 ($100,000.00).
    sku
    string or null
    SKU: letters, numbers, spaces and - _ . / #. Up to 64 characters.
    physical
    boolean
    Ships: checkout asks for a shipping address. Default false.
    Request
    curl -X POST https://anytime-capital.com/api/v1/products \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: product-mug-12" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Ceramic mug",
        "priceCents": 1800,
        "sku": "MUG-12",
        "physical": true
      }'
    const res = await fetch("https://anytime-capital.com/api/v1/products", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": "product-mug-12",
      },
      body: JSON.stringify({ name: "Ceramic mug", priceCents: 1800, sku: "MUG-12", physical: true }),
    });
    const product = await res.json();
    if (!res.ok) throw new Error(`${product.error.code}: ${product.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const product = await client.products.create(
      { name: "Ceramic mug", priceCents: 1800, sku: "MUG-12", physical: true },
      { idempotencyKey: "product-mug-12" },
    );
    import os
    
    import requests
    
    res = requests.post(
        "https://anytime-capital.com/api/v1/products",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "product-mug-12",
        },
        json={
            "name": "Ceramic mug",
            "priceCents": 1800,
            "sku": "MUG-12",
            "physical": True,
        },
        timeout=30,
    )
    product = res.json()
    if not res.ok:
        raise RuntimeError(f"{product['error']['code']}: {product['error']['message']}")
    Response 201
    {
      "object": "product",
      "livemode": true,
      "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      "name": "Ceramic mug",
      "description": null,
      "priceCents": 1800,
      "currency": "usd",
      "sku": "MUG-12",
      "physical": true,
      "imageUrl": null,
      "active": true,
      "createdAt": "2026-10-02T10:00:00.000Z",
      "archivedAt": null
    }

    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.
    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.

    List products

    GET/api/v1/products
    Permission products:read

    The product catalog, newest first.

    Query

    active
    boolean
    true for live objects, false for deactivated or archived ones.
    limit
    integer
    How many objects per page, 1–100. Default 25. See Pagination.
    cursor
    string
    The previous page's nextCursor, for the page after it.
    Request
    curl "https://anytime-capital.com/api/v1/products?active=true" \
      -H "Authorization: Bearer $ANYTIME_API_KEY"
    const res = await fetch("https://anytime-capital.com/api/v1/products?active=true", {
      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.products.list({ active: true });
    import os
    
    import requests
    
    res = requests.get(
        "https://anytime-capital.com/api/v1/products",
        headers={"Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}"},
        params={"active": "true"},
        timeout=30,
    )
    page = res.json()
    if not res.ok:
        raise RuntimeError(f"{page['error']['code']}: {page['error']['message']}")
    Response 200
    {
      "object": "list",
      "data": [
        {
          "object": "product",
          "livemode": true,
          "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
          "name": "Ceramic mug",
          "description": "Hand-glazed, 12 oz.",
          "priceCents": 1800,
          "currency": "usd",
          "sku": "MUG-12",
          "physical": true,
          "imageUrl": null,
          "active": true,
          "createdAt": "2026-10-02T10:00:00.000Z",
          "archivedAt": null
        }
      ],
      "hasMore": false,
      "nextCursor": null
    }

    Errors

    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.

    Get a product

    GET/api/v1/products/{id}
    Permission products:read

    One product.

    Path

    id
    stringrequired
    prod_…
    Request
    curl https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk \
      -H "Authorization: Bearer $ANYTIME_API_KEY"
    const res = await fetch("https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk", {
      headers: { Authorization: `Bearer ${process.env.ANYTIME_API_KEY}` },
    });
    const product = await res.json();
    if (!res.ok) throw new Error(`${product.error.code}: ${product.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const product = await client.products.retrieve("prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk");
    import os
    
    import requests
    
    res = requests.get(
        "https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
        headers={"Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}"},
        timeout=30,
    )
    product = res.json()
    if not res.ok:
        raise RuntimeError(f"{product['error']['code']}: {product['error']['message']}")
    Response 200
    {
      "object": "product",
      "livemode": true,
      "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      "name": "Ceramic mug",
      "description": "Hand-glazed, 12 oz.",
      "priceCents": 1800,
      "currency": "usd",
      "sku": "MUG-12",
      "physical": true,
      "imageUrl": null,
      "active": true,
      "createdAt": "2026-10-02T10:00:00.000Z",
      "archivedAt": null
    }

    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 product

    PATCH/api/v1/products/{id}
    Permission products:writeSupports Idempotency-Key.

    Change name, description, price, SKU or physical. Payment links already selling it keep the name and price they were made with.

    Path

    id
    stringrequired
    prod_…

    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

    name
    string
    Name. Up to 120 characters.
    description
    string or null
    Description. Up to 1000 characters.
    priceCents
    integer
    Price in cents. From 1 ($0.01) to 10,000,000 ($100,000.00).
    sku
    string or null
    SKU: letters, numbers, spaces and - _ . / #. Up to 64 characters.
    physical
    boolean
    Ships: checkout asks for a shipping address. Default false.
    Request
    curl -X PATCH https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: product-mug-price-2000" \
      -H "Content-Type: application/json" \
      -d '{
        "priceCents": 2000
      }'
    const res = await fetch("https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk", {
      method: "PATCH",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Content-Type": "application/json",
        "Idempotency-Key": "product-mug-price-2000",
      },
      body: JSON.stringify({ priceCents: 2000 }),
    });
    const product = await res.json();
    if (!res.ok) throw new Error(`${product.error.code}: ${product.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const product = await client.products.update(
      "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      { priceCents: 2000 },
      { idempotencyKey: "product-mug-price-2000" },
    );
    import os
    
    import requests
    
    res = requests.patch(
        "https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "product-mug-price-2000",
        },
        json={"priceCents": 2000},
        timeout=30,
    )
    product = res.json()
    if not res.ok:
        raise RuntimeError(f"{product['error']['code']}: {product['error']['message']}")
    Response 200
    {
      "object": "product",
      "livemode": true,
      "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      "name": "Ceramic mug",
      "description": "Hand-glazed, 12 oz.",
      "priceCents": 2000,
      "currency": "usd",
      "sku": "MUG-12",
      "physical": true,
      "imageUrl": null,
      "active": true,
      "createdAt": "2026-10-02T10:00:00.000Z",
      "archivedAt": null
    }

    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.

    Archive a product

    POST/api/v1/products/{id}/archive
    Permission products:writeSupports Idempotency-Key.

    Take it out of the catalog. Safe to repeat. Nothing is deleted; restore it from Products in the dashboard.

    Path

    id
    stringrequired
    prod_…

    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 POST https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk/archive \
      -H "Authorization: Bearer $ANYTIME_API_KEY" \
      -H "Idempotency-Key: product-mug-archive"
    const res = await fetch("https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk/archive", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.ANYTIME_API_KEY}`,
        "Idempotency-Key": "product-mug-archive",
      },
    });
    const product = await res.json();
    if (!res.ok) throw new Error(`${product.error.code}: ${product.error.message}`);
    import { AnytimeCapital } from "@anytimecapital/node";
    
    const client = new AnytimeCapital({ apiKey: process.env.ANYTIME_API_KEY! });
    
    const product = await client.products.archive(
      "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      { idempotencyKey: "product-mug-archive" },
    );
    import os
    
    import requests
    
    res = requests.post(
        "https://anytime-capital.com/api/v1/products/prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk/archive",
        headers={
            "Authorization": f"Bearer {os.environ['ANYTIME_API_KEY']}",
            "Idempotency-Key": "product-mug-archive",
        },
        timeout=30,
    )
    product = res.json()
    if not res.ok:
        raise RuntimeError(f"{product['error']['code']}: {product['error']['message']}")
    Response 200
    {
      "object": "product",
      "livemode": true,
      "id": "prod_Lm3Qx8Rt2Vb7Nc4Zp9Wk",
      "name": "Ceramic mug",
      "description": "Hand-glazed, 12 oz.",
      "priceCents": 1800,
      "currency": "usd",
      "sku": "MUG-12",
      "physical": true,
      "imageUrl": null,
      "active": false,
      "createdAt": "2026-10-02T10:00:00.000Z",
      "archivedAt": "2026-10-24T12:00:00.000Z"
    }

    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.
    PreviousCustomersNext Subscriptions & plans

    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 product object
    • Endpoints
    • Create a product
    • List products
    • Get a product
    • Update a product
    • Archive a product
    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