# DMLY > DMLY is the WhatsApp-first customer engagement platform - unified inbox, chatbots, broadcasts, CRM, appointments and payments. - [DMLY documentation](https://docs.dmly.io/index.md): Everything you need to run your business on WhatsApp: the unified inbox, chatbots, broadcasts, bookings and payments. - [Create your account](https://docs.dmly.io/getting-started/create-account.md): Sign up for DMLY, verify your email, and land in your new workspace. - [Workspaces](https://docs.dmly.io/getting-started/workspaces.md): A workspace is one business in DMLY: its name, its channels, its contacts, its team, and everything scoped to it. - [Set up your workspace](https://docs.dmly.io/getting-started/setup-checklist.md): The order to do things in to go from an empty DMLY workspace to a working WhatsApp inbox, team and first automation. - [Migrate to DMLY](https://docs.dmly.io/getting-started/migrating-to-dmly.md): Move your WhatsApp number, contacts and catalogue over from another WhatsApp tool, a CRM or a spreadsheet, and know exactly what has to be rebuilt. - [Navigating DMLY](https://docs.dmly.io/getting-started/navigating-dmly.md): A tour of the DMLY sidebar: what each area does, and where to find settings, your team and integrations. - [The DMLY mobile app](https://docs.dmly.io/getting-started/mobile-app.md): Run the day from your phone: the inbox on every channel, the calendar, the money and push notifications, with two-factor sign-in and workspace switching. - [Install DMLY as an app](https://docs.dmly.io/getting-started/install-app.md): Get the DMLY app on Android, or install the dashboard from your browser on a computer or any other device. - [The unified inbox](https://docs.dmly.io/inbox/overview.md): Every conversation from every channel in one list: how the Inbox is scoped, how you work a thread, and what you can send. - [Assign chats to teammates](https://docs.dmly.io/inbox/assigning-chats.md): Assign a conversation to a teammate, understand what assignment does and does not change, and divide inbox work across a team. - [Open and done conversations](https://docs.dmly.io/inbox/conversation-status.md): How open and done work in the Inbox, what marking a conversation done fires, and how to clear a busy queue. - [Use saved replies](https://docs.dmly.io/inbox/quick-replies.md): Save the answers you type over and over and insert them into any Inbox conversation in one click. - [Work a conversation as a team](https://docs.dmly.io/inbox/notes-and-collaboration.md): Leave internal notes, mention teammates, see who else is typing, and take a conversation off the bot. - [Notifications](https://docs.dmly.io/inbox/notifications.md): Use the notification bell to keep your team on top of new chats, mentions, bookings and payments. - [Make and take WhatsApp calls](https://docs.dmly.io/inbox/whatsapp-calling.md): Take WhatsApp voice calls in the Inbox, see what calling a contact requires, and follow up on calls automatically. - [Channels overview](https://docs.dmly.io/channels/overview.md): What a channel is, which ones you can connect to DMLY, and what each one can and cannot do. - [Connect WhatsApp](https://docs.dmly.io/channels/whatsapp.md): Connect a WhatsApp Business number to DMLY, register it with Meta, and work within the 24-hour window. - [Connect a Facebook Page](https://docs.dmly.io/channels/facebook-messenger.md): Connect a Facebook Page to DMLY so Messenger conversations land in your inbox, and learn what Meta's 24-hour window allows. - [Connect Instagram](https://docs.dmly.io/channels/instagram.md): Connect a Business Instagram account through its Facebook Page and see what Instagram supports in DMLY. - [Connect Telegram](https://docs.dmly.io/channels/telegram.md): Connect a Telegram bot to DMLY with a BotFather token so Telegram chats land in your Inbox. - [Add the Live Chat widget to your website](https://docs.dmly.io/channels/livechat-widget.md): Create a website chat widget in Bot Setup, paste the snippet on your site, and answer visitors in your Inbox. - [Connect Google Business Profile](https://docs.dmly.io/channels/google-business-profile.md): Connect your Google Business Profile to DMLY to manage reviews, posts and local performance, but it is not a messaging channel. - [Connect SMS](https://docs.dmly.io/channels/sms.md): Connect Twilio, Plivo or a custom HTTP gateway so you can text contacts, take replies in your Inbox, and send SMS broadcasts with no messaging window. - [Connect TikTok](https://docs.dmly.io/channels/tiktok.md): Connect a TikTok Business account so DMs and video comments reach your Inbox, and what TikTok cannot do. - [WhatsApp limits and quality rating](https://docs.dmly.io/channels/whatsapp-limits.md): How WhatsApp's 24-hour window, messaging tier and quality rating work, and which rules DMLY enforces versus which ones Meta enforces. - [Fix no inbound messages](https://docs.dmly.io/channels/no-inbound-messages.md): Your WhatsApp number says connected but nothing reaches the Inbox: how to tell whether Meta is calling DMLY at all, and what to fix. - [Fix a silent Facebook Page or Instagram account](https://docs.dmly.io/channels/no-inbound-meta.md): Your Page or Instagram account shows connected but nothing reaches the Inbox: the four causes, how to tell them apart, and which you can fix yourself. - [Recover a disabled WhatsApp account](https://docs.dmly.io/channels/account-disabled.md): What to do when Meta disables or restricts your WhatsApp Business account, and what DMLY can and cannot do about it. - [Delete a WhatsApp number](https://docs.dmly.io/channels/delete-whatsapp-number.md): Disconnect a WhatsApp number from your workspace, and understand what DMLY can and cannot delete on Meta's side. - [Contacts overview](https://docs.dmly.io/contacts/overview.md): What a contact is in DMLY: one person, owned by your workspace, across every channel they message you on. - [Import contacts from CSV](https://docs.dmly.io/contacts/import-csv.md): Bring an existing contact list into DMLY with a CSV file, and understand which rows get skipped. - [Tags and segments](https://docs.dmly.io/contacts/tags-and-segments.md): Tags are labels you stick on a contact; segments are saved filters that rebuild themselves every time you use them. - [Custom fields](https://docs.dmly.io/contacts/custom-fields.md): Define the extra details your business keeps on a contact, add values, and see where booking forms and CSV imports fill them in. - [Pipeline stages](https://docs.dmly.io/contacts/pipeline-stages.md): Set up your sales pipeline, move contacts through its stages, and use stages to target broadcasts. - [Client profile](https://docs.dmly.io/contacts/client-profile.md): Read a contact's profile page: its metrics, records tabs, and the actions you can take from it. - [Attach documents to a contact](https://docs.dmly.io/contacts/documents.md): Upload private files to a contact's profile (contracts, ID scans, signed forms) and control who can add or remove them. - [Generate client letters](https://docs.dmly.io/contacts/letters.md): Build a reusable letter template with merge tokens and generate a branded, personalized PDF letter for one contact. - [Linked contacts](https://docs.dmly.io/contacts/linked-contacts.md): Link two contacts as family (parent, child, spouse, guardian or sibling) and see the relationship from each person's own profile. - [Data, privacy and consent](https://docs.dmly.io/contacts/data-and-privacy.md): How opt-out, blocking, export and deletion work in DMLY, and precisely what each one does and does not stop. - [How automation works](https://docs.dmly.io/automation/overview.md): What an Automation is in DMLY, the two ways to build one, what can trigger it, and when to use a flow instead of a sequence or a broadcast. - [Build a flow](https://docs.dmly.io/automation/flow-builder.md): How the flow builder canvas works, and which step groups you get on each channel. - [Triggers](https://docs.dmly.io/automation/triggers.md): Every event that can start an automation, which triggers are tied to a single channel, and how DMLY decides which automation runs. - [Variables reference](https://docs.dmly.io/automation/variables.md): Every token you can put in a message: where each one gets its data, and when it comes out empty. - [Call a webhook from a flow](https://docs.dmly.io/automation/webhook-step.md): The HTTP Request step: send flow data to any public URL mid-conversation, and save fields from the JSON response for later steps. - [Start from a template](https://docs.dmly.io/automation/templates.md): Install a ready-made automation from the template library and edit it in the flow builder. - [Sell on WhatsApp](https://docs.dmly.io/automation/sell-on-whatsapp.md): Show your catalogue in the chat, take the customer's cart, and collect payment with a Pay now button, end to end. - [Store automations](https://docs.dmly.io/automation/store-automations.md): Start flows from Shopify and WooCommerce events, narrow them with order filters, and answer "where is my order?" in the chat automatically. - [Reply with AI](https://docs.dmly.io/automation/ai-replies.md): Add an AI Reply step to an automation so an assistant answers your contacts in your own words. - [AI agent tools](https://docs.dmly.io/automation/ai-agent-tools.md): Switch on the CRM, booking, document search and web tools an AI Reply node can use to act, not just answer. - [Publish a flow](https://docs.dmly.io/automation/publishing-bots.md): Publish a flow to make it live, understand what the builder blocks and warns about, and turn automations on and off. - [Sequences](https://docs.dmly.io/automation/sequences.md): Drip campaigns: an ordered series of messages sent to each contact on a schedule, starting when a flow subscribes them. - [Build a lead qualification bot](https://docs.dmly.io/automation/lead-qualification.md): Install a ready-made lead qualification template, tune it, and publish a bot that captures interest, tags hot leads and hands them to a human. - [Automate comments and comment-to-DM](https://docs.dmly.io/automation/comment-automation.md): Reply to comments automatically, DM commenters privately, and hide or delete unwanted comments on Facebook, Instagram and TikTok. - [Set up ice breakers](https://docs.dmly.io/automation/icebreakers.md): Offer first-time contacts tappable questions that answer them or start a flow, and see what each channel actually supports. - [Set up a persistent menu](https://docs.dmly.io/automation/persistent-menu.md): Give Facebook, Instagram and Telegram contacts an always-visible menu whose items open a link or start a flow. - [Ask for a phone number](https://docs.dmly.io/automation/request-phone.md): Use the Request Phone Number step to ask a WhatsApp contact to share their number when you don't have one on file. - [Common mistakes](https://docs.dmly.io/automation/common-mistakes.md): Why a bot never replies, why publish is blocked, and the WhatsApp and AI traps that catch most flows. - [Bot setup](https://docs.dmly.io/automation/bot-setup.md): Configure each channel's bot (its welcome, ice breakers, menu and default reply) from one page that changes with the channel you have selected. - [WhatsApp Flows](https://docs.dmly.io/automation/whatsapp-flows.md): Design an in-chat WhatsApp form in DMLY (or sync one built in Meta), then send it from an automation, the inbox, or a template button. - [Broadcasts overview](https://docs.dmly.io/broadcasts/overview.md): What a broadcast is, which channels support it, and when to send one instead of a sequence or an automation. - [Create a broadcast](https://docs.dmly.io/broadcasts/create-campaign.md): Build and send a broadcast with the four-step wizard: audience, message, schedule, review. - [Message templates](https://docs.dmly.io/broadcasts/message-templates.md): Build a WhatsApp message template, get it approved by Meta, and use its variables in a broadcast. - [WhatsApp rules and limits for broadcasts](https://docs.dmly.io/broadcasts/whatsapp-rules-and-limits.md): What WhatsApp lets a broadcast do: approved templates only, why the 24-hour window rarely matters, and which failures come from DMLY versus Meta. - [Choose who receives a broadcast](https://docs.dmly.io/broadcasts/audiences.md): Pick a broadcast audience with segments or retargeting, and understand how opt-outs and unreachable contacts are handled. - [Schedule a broadcast](https://docs.dmly.io/broadcasts/scheduling.md): Send a broadcast now or at a set time, understand which timezone it uses, and change it before it goes out. - [Read broadcast results](https://docs.dmly.io/broadcasts/analytics.md): Understand the Sent, Delivered, Opened and Failed numbers on a broadcast, what a failure usually means, and how each WhatsApp template tracks its own performance. - [Overview](https://docs.dmly.io/growth/overview.md): Growth tools are trackable links and QR codes that turn a poster, a bio link or a shop window into a WhatsApp conversation in your inbox. - [QR codes and links](https://docs.dmly.io/growth/qr-codes-and-links.md): Create a trackable QR code or chat link that opens a WhatsApp conversation and drops the person straight into a flow. - [Appointments overview](https://docs.dmly.io/appointments/overview.md): How the Appointments module fits together: services live under Offerings, staff carry the availability, and clients book on your public page. - [Bookable services](https://docs.dmly.io/appointments/services.md): A service is the thing a client books: its duration, price and payment mode drive every slot your booking page offers. - [Staff and availability](https://docs.dmly.io/appointments/staff-and-availability.md): Add staff, set their working hours and services, and understand exactly how DMLY works out which slots a client can book. - [Booking page](https://docs.dmly.io/appointments/booking-page.md): Your public booking page: its address, what a contact sees and does, and how to share, embed or install it. - [Client portal](https://docs.dmly.io/appointments/client-portal.md): Let a returning client sign in with a WhatsApp one-time code to see their booking history, without a password. - [Run group classes](https://docs.dmly.io/appointments/classes.md): Schedule classes with a seat capacity and a waitlist, and control what happens when a place opens up. - [Take payment for a booking](https://docs.dmly.io/appointments/payments.md): Charge for an appointment with one of three payment modes: no payment, pay after, or pay before with a 15-minute slot hold. - [Sync Google Calendar and Zoom](https://docs.dmly.io/appointments/calendar-sync.md): Connect a Google Calendar for the business and one for each staff member, and Zoom so bookings get a join link automatically. - [Connect a custom booking domain](https://docs.dmly.io/appointments/custom-domain.md): Serve your DMLY booking page on your own domain, such as book.yourbusiness.com, with SSL issued automatically. - [Meetings](https://docs.dmly.io/appointments/meetings.md): Meetings is DMLY's older booking hub: it no longer appears in the sidebar, and Appointments and Offerings replace it. - [Offerings overview](https://docs.dmly.io/offerings/overview.md): The catalogue behind DMLY: Services are what you do, Products are what you sell, Plans are what you bundle them into. - [Sell products and track stock](https://docs.dmly.io/offerings/products.md): Add products to your catalogue, track stock levels, get alerted when stock runs low, and send a product to a contact from a flow. - [Plans and credits](https://docs.dmly.io/offerings/plans-and-credits.md): How a plan grants credits, how a booking spends them, and when unused credits expire. - [Sell and redeem gift cards](https://docs.dmly.io/offerings/gift-cards.md): Sell a fixed-value gift card, activate it once it's paid for, and let a client spend it against any invoice. - [Organise the catalogue with categories](https://docs.dmly.io/offerings/categories.md): Group services, products and plans into categories so a long catalogue stays easy to filter. - [Overview](https://docs.dmly.io/finance/overview.md): How DMLY Finance bills your clients with invoices, orders, subscriptions and payments, and how it differs from your own DMLY plan. - [Create and send an invoice](https://docs.dmly.io/finance/invoices.md): Build an invoice from your catalogue, send it on WhatsApp with a pay link and QR code, and track it from draft to paid. - [Orders](https://docs.dmly.io/finance/orders.md): How orders move product stock, and why the invoice, not the order, is what collects the money. - [Connect a payment gateway](https://docs.dmly.io/finance/payments-and-gateways.md): Connect Stripe, PayPal, Paystack, Razorpay, MyFatoorah or Mercado Pago, share a pay link on WhatsApp, and understand what a missed webhook means. - [Subscriptions](https://docs.dmly.io/finance/subscriptions.md): Bill your clients on a repeating plan: auto-charge, renewals, pausing, cancelling and failed payments. - [Statements](https://docs.dmly.io/finance/statements.md): Read a contact's running account ledger of what they owe and what they have paid. - [Coupons and loyalty](https://docs.dmly.io/finance/coupons.md): How percentage and fixed-amount coupons discount an invoice or an order, and how loyalty points turn into a reward coupon on their own. - [Record expenses](https://docs.dmly.io/finance/expenses.md): Track what your business spends, filed by vendor, category and account, alongside the money coming in. - [Set your Finance defaults](https://docs.dmly.io/finance/settings.md): Set the currency, due days, document numbering, tax and shipping defaults DMLY copies onto every invoice you raise. - [Reputation overview](https://docs.dmly.io/reputation/overview.md): Reputation is a real Google Business Profile engine: read and reply to reviews, publish posts, edit your listing, and ask customers for reviews on WhatsApp. - [Connect Google Business Profile](https://docs.dmly.io/reputation/connect-google-business-profile.md): Connect one or more Google Business Profile locations to DMLY to manage reviews, posts, performance and business details. - [Read and reply to Google reviews](https://docs.dmly.io/reputation/reviews.md): Read your Google Business Profile reviews in DMLY, post a public reply, and understand what Google lets you change. - [Ask for Google reviews](https://docs.dmly.io/reputation/review-requests.md): Send customers a tracked Google review link on WhatsApp, SMS or email, by hand or automatically from a flow. - [Publish posts and read performance](https://docs.dmly.io/reputation/posts-and-performance.md): Publish an update, offer or event to your Google Business Profile, schedule it for later, and read the numbers on the Performance tab. - [Overview](https://docs.dmly.io/analytics/overview.md): Read the Overview dashboard: quick actions, at-a-glance numbers, message volume, peak conversation hours, flow outcomes, broadcast funnel and contact sources. - [Conversation reports](https://docs.dmly.io/analytics/conversation-reports.md): Read the inbound and outbound message numbers on your Overview page, and understand what each one counts. - [Collect customer satisfaction scores](https://docs.dmly.io/analytics/csat.md): Ask contacts to rate your service in WhatsApp, route each score to a different follow-up, send happy responders to a Google review, and read the results on the CSAT report. - [Read the team performance report](https://docs.dmly.io/analytics/team-performance.md): See how each teammate handles conversations (assignments, closes, replies, contacts and response times), filterable by date and exportable as CSV or PDF. - [Read the finance report](https://docs.dmly.io/analytics/finance-report.md): See what cash came in, what you billed, what is still owed and what you spent, with the breakdown behind each figure, filterable by date and exportable as CSV or PDF. - [Read the ads report](https://docs.dmly.io/analytics/ads-report.md): See what each Click-to-WhatsApp ad produced in conversations, contacts and revenue, why the money beside an ad is not return on ad spend, and how first-touch credit works. - [Export your data](https://docs.dmly.io/analytics/exporting-reports.md): What you can export from DMLY, in what format, and how to get everything else through the API. - [Manage your profile](https://docs.dmly.io/account/profile.md): Change your own name, email, language, timezone, password and two-factor authentication in DMLY. - [Set your business details](https://docs.dmly.io/account/business-details.md): Set the business name, logo, brand colour, currency and contact details your workspace uses everywhere. - [Set how conversations behave](https://docs.dmly.io/account/conversation-settings.md): Choose what a teammate's reply does to the bot, who owns a conversation afterwards, when a closed one reopens, and whether the AI may answer. - [Invite and manage team members](https://docs.dmly.io/account/team-members.md): Invite teammates to your workspace by email, give them a role, and remove or revoke access when they leave. - [Control what your team can do](https://docs.dmly.io/account/roles-and-permissions.md): Set a base role for each team member and build custom roles that grant an exact set of permissions. - [Set up notifications](https://docs.dmly.io/account/notifications.md): Choose which events message your clients, which alert your team, and on which channel, all set once for the whole workspace. - [Secure your account](https://docs.dmly.io/account/security.md): Turn on two-factor authentication, control who can do what in your workspace, and understand what DMLY protects and what it doesn't. - [Read the workspace audit log](https://docs.dmly.io/account/audit-log.md): Browse an append-only trail of high-value actions taken in your workspace, filterable by action and date range. - [Choosing a plan](https://docs.dmly.io/billing/choosing-a-plan.md): Which DMLY plan suits your business: what actually differs between Starter, Growth and Premium, and how to pick without overbuying. - [How plans work](https://docs.dmly.io/billing/plans.md): What your DMLY plan controls, where to see it, and what happens when you reach a limit. - [Change your plan](https://docs.dmly.io/billing/upgrading-downgrading.md): Upgrade, downgrade or switch billing cycle from Workspace Settings, and what happens when a new plan has a lower limit than your current usage. - [Buy add-ons](https://docs.dmly.io/billing/add-ons.md): Add extra contacts, profiles or teammates on top of your plan without changing plan. - [Pay for DMLY](https://docs.dmly.io/billing/payment-methods.md): Update the card that pays for your DMLY subscription, and find the receipts for what you've paid. - [Cancel your subscription](https://docs.dmly.io/billing/cancelling.md): Cancel a DMLY subscription, keep your data, and understand what deleting a workspace does instead. - [Overview](https://docs.dmly.io/integrations/overview.md): Browse the Integrations page, connect a tool to your workspace, and understand the AI plan gate. - [Connect Claude](https://docs.dmly.io/integrations/claude.md): Run your workspace by conversation: ask Claude or another AI assistant to look things up, draft replies, book appointments and raise invoices. - [Connect OpenAI](https://docs.dmly.io/integrations/openai.md): Connect an OpenAI API key so your flows can reply with AI, search your documents and call tools. - [Build a knowledge base](https://docs.dmly.io/integrations/knowledge-base.md): Group your price list, policies and FAQs into collections under Settings so the AI answers contacts from your own material instead of guessing. - [Connect Shopify](https://docs.dmly.io/integrations/shopify.md): Connect your Shopify store so orders, customers and products sync into DMLY, and store events can start WhatsApp automations. - [Connect WooCommerce](https://docs.dmly.io/integrations/woocommerce.md): Connect your WooCommerce store with a REST API key so orders, customers and products sync into DMLY and store events can start automations. - [Connect Zapier](https://docs.dmly.io/integrations/zapier.md): Generate a Zapier API key in DMLY, subscribe a Zap to workspace events, and test the wiring with a sample payload. - [Connect n8n](https://docs.dmly.io/integrations/n8n.md): Automate DMLY from n8n with the community node: a DMLY action node plus a DMLY Trigger for signed webhook events. - [Connect Zoom](https://docs.dmly.io/integrations/zoom.md): Connect a Zoom account so bookings on Zoom services get a meeting and join link created automatically. - [Connect Mercado Pago](https://docs.dmly.io/integrations/mercado-pago.md): Collect Latin-American payments with Mercado Pago Checkout Pro, including supported currencies and how a payment gets confirmed. - [Import from Google Drive](https://docs.dmly.io/integrations/google-drive.md): Pick images and videos from your Google Drive and import them into the DMLY media library. - [Agency overview](https://docs.dmly.io/agency/overview.md): How the DMLY agency layer lets you resell the platform under your own brand, domain, and Stripe account. - [Brand DMLY as your own](https://docs.dmly.io/agency/branding.md): Set your app name, logo, colour and Powered by link so your clients see your brand instead of DMLY. - [Client workspaces](https://docs.dmly.io/agency/client-workspaces.md): How client workspaces join your agency, and how to assign plans, grant add-ons, suspend access, and open one as the customer. - [Price and bill your clients](https://docs.dmly.io/agency/plans-and-billing.md): Set up your own plans, charge clients through your own Stripe account, and understand what your reseller plan pays for. - [Connect Stripe](https://docs.dmly.io/agency/connect-stripe.md): Connect your agency's own Stripe account so client workspaces can subscribe and pay you online, and set up the webhook that keeps DMLY in sync. - [Connect your agency domain](https://docs.dmly.io/agency/custom-domain.md): Serve your agency's DMLY on a domain you own, so your customers sign up and work under your address instead of a DMLY one. - [Data storage and security](https://docs.dmly.io/compliance/data-security.md): Where DMLY stores your data, how it's protected in transit and at rest, and how one workspace's data is kept separate from another's. - [Privacy and data protection](https://docs.dmly.io/compliance/privacy.md): How DMLY supports your GDPR obligations, who is responsible for what, and how the data rights work in the product. - [Automation not triggering](https://docs.dmly.io/troubleshooting/automation-not-triggering.md): Work out why a bot never started, in the order that finds the cause fastest: from the channel it is built on to the guards that stop a flow without saying so. - [Fix a message that didn't send](https://docs.dmly.io/troubleshooting/messages-not-sending.md): Work out why a message never left DMLY: the 24-hour window, template approval, contact reachability, and what the failure actually was. - [Known issues](https://docs.dmly.io/troubleshooting/known-issues.md): Current limitations in DMLY that behave as designed, and where to go when something looks broken instead. - [Reading the Logs page](https://docs.dmly.io/troubleshooting/logs.md): Use the Logs tab on Reports to find out why a message, bot or integration didn't do what you expected, or to see business activity across your workspace. - [Introduction](https://docs.dmly.io/api-reference/introduction.md): The DMLY REST API: contacts, conversations, broadcasts, bookings, finance, webhooks and media. - [Authentication](https://docs.dmly.io/api-reference/authentication.md): Authenticate with a workspace API key, sent as the x-api-key header. - [Pagination](https://docs.dmly.io/api-reference/pagination.md): List endpoints return data, links and meta. Page with ?page and size with ?per_page. - [Errors](https://docs.dmly.io/api-reference/errors.md): Conventional HTTP status codes, with a consistent JSON error body. - [Rate limits](https://docs.dmly.io/api-reference/rate-limits.md): 60 requests per minute on the workspace REST API, counted per API key; every key gets its own budget. - [Webhooks](https://docs.dmly.io/api-reference/webhooks.md): Subscribe to 75 events and DMLY posts to your endpoint as they happen. - [Get the authenticated workspace](https://docs.dmly.io/api-reference/account/get-the-authenticated-workspace.md): Returns the workspace (account) that the API key belongs to. Useful as a connectivity / auth check. - [List connected messaging channels.](https://docs.dmly.io/api-reference/channels/list-connected-messaging-channels.md): Returns a paginated list of the workspace's connected messaging accounts (WhatsApp, Facebook, Instagram, SMS, Telegram, Live Chat, TikTok, etc.). Channels are connected via OAuth in the dashboard, so this endpoint is read-only. Supports keyword, platform, and status filtering. Results are ordered by… - [Retrieve a single connected channel.](https://docs.dmly.io/api-reference/channels/retrieve-a-single-connected-channel.md): Returns a single connected messaging channel by its public id (uuid). Responds 404 if no matching channel exists in the current workspace. - [List contacts](https://docs.dmly.io/api-reference/contacts/list-contacts.md): Paginated list of contacts (DMLY's unified person record). A 'client' is simply a contact with lifecycle_stage=client. - [Create a contact](https://docs.dmly.io/api-reference/contacts/create-a-contact.md): Creates a contact. If a channel uuid is supplied, a channel identity is attached. Fires the contact.created webhook. - [Get a contact](https://docs.dmly.io/api-reference/contacts/get-a-contact.md): Returns a single contact by its id, with tags and pipeline stage. - [Update a contact](https://docs.dmly.io/api-reference/contacts/update-a-contact.md): Updates a contact's fields. Fires the contact.updated webhook. - [Delete a contact](https://docs.dmly.io/api-reference/contacts/delete-a-contact.md): Deletes a contact and cascades its identities, messages, notes and tag links. - [Add tags to a contact](https://docs.dmly.io/api-reference/contacts/add-tags-to-a-contact.md): Adds tags by name (creating any that don't exist) without removing existing ones. Fires contact.tagged per newly-attached tag. - [Remove tags from a contact](https://docs.dmly.io/api-reference/contacts/remove-tags-from-a-contact.md): Detaches the named tags from the contact. Fires contact.untagged per removed tag. - [Add a note to a contact](https://docs.dmly.io/api-reference/contacts/add-a-note-to-a-contact.md): Appends a timeline note to the contact. - [Set a contact's pipeline stage](https://docs.dmly.io/api-reference/contacts/set-a-contacts-pipeline-stage.md): Moves the contact to a pipeline stage (or clears it with null). Fires contact.stage_changed. - [Set a contact's lifecycle stage](https://docs.dmly.io/api-reference/contacts/set-a-contacts-lifecycle-stage.md): Moves the contact along the CRM lifecycle. 'client' converts via the lifecycle service (creates a client profile); 'lead' downgrades (blocked if commercial records exist). - [List tags](https://docs.dmly.io/api-reference/tags/list-tags.md): Paginated list of contact tags with contact counts. - [Create a tag](https://docs.dmly.io/api-reference/tags/create-a-tag.md): Creates a tag (or returns the existing one with the same name). - [Get a tag](https://docs.dmly.io/api-reference/tags/get-a-tag.md): Returns a single tag by id. - [Update a tag](https://docs.dmly.io/api-reference/tags/update-a-tag.md): Renames or recolours a tag. - [Delete a tag](https://docs.dmly.io/api-reference/tags/delete-a-tag.md): Deletes a tag and detaches it from contacts. The built-in 'Unsubscribe' tag cannot be deleted. - [List saved contact segments.](https://docs.dmly.io/api-reference/segments/list-saved-contact-segments.md): Returns a paginated list of the workspace's saved contact filters. Each segment includes its embedded stage, include/exclude tag uuids and recency threshold. contacts_count is NOT included by default on this endpoint: pass with_counts=1 to compute it. (A single segment fetched, created or updated al… - [Create a saved contact segment.](https://docs.dmly.io/api-reference/segments/create-a-saved-contact-segment.md): Creates a new contact filter. name is required (max 80). stage is an optional stage uuid. include_tags/exclude_tags are arrays of tag uuids (contacts must have ALL include tags and NONE of the exclude tags). min_days_inactive filters to contacts with no interaction for at least N days. conditions is… - [Retrieve a single segment.](https://docs.dmly.io/api-reference/segments/retrieve-a-single-segment.md): Returns one saved contact segment by its uuid, including its embedded stage, tag uuids, recency threshold, and live contacts_count. - [Update a saved contact segment.](https://docs.dmly.io/api-reference/segments/update-a-saved-contact-segment.md): Updates a segment by uuid. All fields are optional; only supplied fields are changed. Same validation rules as create (name max 80, stage uuid, tag uuid arrays, min_days_inactive >= 0, and the same conditions rule tree with its fields, operators and caps of 20 groups by 30 rules). Sending conditions… - [Delete a saved contact segment.](https://docs.dmly.io/api-reference/segments/delete-a-saved-contact-segment.md): Deletes a segment by uuid. Returns {"deleted": true}. The underlying contacts are not affected. - [List the contacts matching a segment.](https://docs.dmly.io/api-reference/segments/list-the-contacts-matching-a-segment.md): Returns a paginated list of the contacts that currently match the segment's filter criteria (stage + include/exclude tags + recency, ANDed with the grouped conditions tree if the segment has one), as full contact resources with their tags and stage loaded. Because conditions are never echoed back, t… - [List conversations (the unified inbox).](https://docs.dmly.io/api-reference/conversations-&-messages/list-conversations-the-unified-inbox.md): Returns the workspace's conversations — Contacts that have an inbox presence — ordered by most recent activity (last_interaction_at, then id). Each item carries the conversation rollups: name, platform, last_message preview, unread_count, inbox_status and last_interaction_at. The conversation id is… - [List the messages in one conversation thread.](https://docs.dmly.io/api-reference/conversations-&-messages/list-the-messages-in-one-conversation-thread.md): Returns the messages for the conversation identified by the contact uuid in the path, oldest-first (ascending id) and paginated. Each message exposes id (message uuid), direction (inbound/outbound), type (text/image/video/audio/file/template/system), kind, body, media, status (sent/delivered/read/fa… - [Send a message into a conversation.](https://docs.dmly.io/api-reference/conversations-&-messages/send-a-message-into-a-conversation.md): Sends an outbound message to the contact identified by contact_id (a contact uuid), routed through the same InboxService used by the dashboard composer — so it is delivered on the contact's active channel, recorded on the thread, broadcast to open inboxes, and fires the standard message.sent / messa… - [List broadcasts in the workspace.](https://docs.dmly.io/api-reference/broadcasts/list-broadcasts-in-the-workspace.md): Returns a paginated list of broadcasts (newest first), each with channel and source-broadcast embeds. Optionally filter by status or by channel uuid. - [Create a broadcast.](https://docs.dmly.io/api-reference/broadcasts/create-a-broadcast.md): Creates a broadcast on the given channel. Status is Draft unless 'schedule' is true (then Scheduled). Scheduling has two modes, set by timezone_mode. With 'fixed' (the default) scheduled_at is the absolute instant every recipient is sent at. With 'contact' you send scheduled_local_at as a naive wall… - [Retrieve a single broadcast.](https://docs.dmly.io/api-reference/broadcasts/retrieve-a-single-broadcast.md): Returns the broadcast identified by its uuid, with channel and source-broadcast embeds and aggregate delivery counters. - [Update a broadcast (PUT or PATCH).](https://docs.dmly.io/api-reference/broadcasts/update-a-broadcast-put-or-patch.md): Updates the broadcast's name, audience, message, schedule, retarget config or approval flag. Re-requiring approval voids any prior sign-off. A broadcast cannot retarget itself (422). All fields are optional. The schedule is only re-derived when the request carries at least one of schedule, scheduled… - [Delete a broadcast.](https://docs.dmly.io/api-reference/broadcasts/delete-a-broadcast.md): Permanently deletes the broadcast identified by its uuid. Returns {"deleted": true}. - [Approve a held broadcast.](https://docs.dmly.io/api-reference/broadcasts/approve-a-held-broadcast.md): Releases a broadcast awaiting approval: clears requires_approval, records the acting API key's user as approver with approved_at=now(), and marks the broadcast Scheduled so the DispatchDueBroadcasts cron can dispatch it. Returns the updated broadcast. - [Send a broadcast now.](https://docs.dmly.io/api-reference/broadcasts/send-a-broadcast-now.md): Marks the broadcast as Scheduled with scheduled_at=now(), so the DispatchDueBroadcasts cron dispatches it on its next run. The queue is never invoked directly. Returns the updated broadcast. - [List a broadcast's recipients.](https://docs.dmly.io/api-reference/broadcasts/list-a-broadcasts-recipients.md): Returns a paginated list of per-contact delivery rows for the broadcast (newest first), each with delivery status, provider message id, error payload and the embedded contact. Optionally filter by recipient status. - [List automations in the workspace.](https://docs.dmly.io/api-reference/automations/list-automations-in-the-workspace.md): Returns a paginated list of the workspace's Salesbot automations (flows and quick automations), newest first. Building or editing flows is out of scope for the API; this endpoint is read-only. Supports filtering by status, trigger type, builder, and the connected channel. - [Retrieve a single automation.](https://docs.dmly.io/api-reference/automations/retrieve-a-single-automation.md): Returns one automation by its uuid. Responds 404 if no automation with that uuid exists in the current workspace. - [Activate an automation.](https://docs.dmly.io/api-reference/automations/activate-an-automation.md): Sets the automation's status to active so it begins running on its trigger. Identified by uuid. Returns the updated automation. No request body is required. - [Pause an automation.](https://docs.dmly.io/api-reference/automations/pause-an-automation.md): Sets the automation's status to paused so it stops running until reactivated. Identified by uuid. Returns the updated automation. No request body is required. - [List 1:1 appointments (paginated).](https://docs.dmly.io/api-reference/appointments/list-1:1-appointments-paginated.md): Returns confirmed/pending/completed/cancelled/no_show 1:1 bookings, newest scheduled first. Class-seat bookings are excluded. Filter by service, staff, contact (all uuids), status, and a scheduled_at window (from/to). - [List open booking slots for a service.](https://docs.dmly.io/api-reference/appointments/list-open-booking-slots-for-a-service.md): Computes bookable slot start instants for a service over a date window, honouring working hours, min-notice/horizon, buffers, calendar busy time and existing bookings. The window runs from the start of `date` (in `timezone`) for `days` days. Returns {"slots": [iso8601 utc, ...]} (max 100). - [Book a 1:1 appointment.](https://docs.dmly.io/api-reference/appointments/book-a-1:1-appointment.md): Re-validates the slot under a lock (no double-booking), then does one of two things depending on the service. A free or pay-after service is booked and confirmed: the calendar event is pushed, the confirmation message is sent, reminders are seeded, and booking.created + appointment_booked fire. A se… - [Get one appointment.](https://docs.dmly.io/api-reference/appointments/get-one-appointment.md): Returns a single 1:1 appointment by its uuid, with the embedded service, staff and contact. - [Reschedule an appointment.](https://docs.dmly.io/api-reference/appointments/reschedule-an-appointment.md): Re-validates the new slot, moves the booking, patches the calendar event, reseeds reminders and notifies the contact, firing booking.rescheduled + appointment_rescheduled. Responds 422 if the booking is terminal or the new slot is taken. `datetime` is parsed in `timezone` (default UTC). - [Cancel an appointment.](https://docs.dmly.io/api-reference/appointments/cancel-an-appointment.md): Cancels the booking: deletes the calendar event, skips pending reminders, messages the contact and fires booking.cancelled + appointment_cancelled. Returns {"cancelled": true}, or false if the booking was already terminal. - [Mark an appointment completed or no-show.](https://docs.dmly.io/api-reference/appointments/mark-an-appointment-completed-or-no-show.md): Transitions a non-terminal appointment to a terminal status. `completed` fires appointment_completed and awards loyalty; `no_show` fires appointment_no_show. Responds 422 if the appointment is already terminal. - [List catalogue services (paginated).](https://docs.dmly.io/api-reference/services-&-service-categories/list-catalogue-services-paginated.md): Returns a paginated list of services for the current workspace, ordered by sort_order then name. Each service embeds its category (id=uuid, name, kind) when present. Supports filtering by type, category, and a name search. - [Create a catalogue service.](https://docs.dmly.io/api-reference/services-&-service-categories/create-a-catalogue-service.md): Creates an appointment, class, or add-on service. category (a ServiceCategory uuid) is resolved server-side. payment_mode sets payment_required automatically. For add_on, booking-policy fields are forced to non-bookable defaults; capacity only applies to class. A unique slug is generated from the na… - [Retrieve a single service.](https://docs.dmly.io/api-reference/services-&-service-categories/retrieve-a-single-service.md): Returns one service (resolved by its uuid) with its embedded category. 404 if not found in the current workspace. - [Update a service (full or partial).](https://docs.dmly.io/api-reference/services-&-service-categories/update-a-service-full-or-partial.md): Updates a service resolved by uuid. Accepts PUT or PATCH; all fields are optional and unspecified fields are left untouched. type changes re-shape add_on/class-specific fields. payment_mode resets payment_required. slug is preserved. Dispatches ServiceUpdated (plus ServiceActivated/Deactivated when… - [Delete (or deactivate) a service.](https://docs.dmly.io/api-reference/services-&-service-categories/delete-or-deactivate-a-service.md): Deletes a service resolved by uuid. If the service has bookings it is deactivated (active=false) instead of deleted to preserve history; the response then has deleted=false with an explanatory message. Otherwise returns deleted=true. - [List service categories (paginated).](https://docs.dmly.io/api-reference/services-&-service-categories/list-service-categories-paginated.md): Returns a paginated list of catalogue categories for the current workspace, ordered by sort_order then name, each with a services_count. Supports filtering by kind and a name search. - [Create a service category.](https://docs.dmly.io/api-reference/services-&-service-categories/create-a-service-category.md): Creates a catalogue category. A unique slug is generated from the name and sort_order is auto-assigned (max+1). Returns 201. - [Retrieve a single category.](https://docs.dmly.io/api-reference/services-&-service-categories/retrieve-a-single-category.md): Returns one category (resolved by its uuid) with its services_count. 404 if not found in the current workspace. - [Update a category (full or partial).](https://docs.dmly.io/api-reference/services-&-service-categories/update-a-category-full-or-partial.md): Updates a category resolved by uuid. Accepts PUT or PATCH; all fields optional. Unspecified fields are left untouched. - [Delete a category.](https://docs.dmly.io/api-reference/services-&-service-categories/delete-a-category.md): Deletes a category resolved by uuid. Any linked services, products and plans are first detached (category_id set to null) so they fall back to 'no category' rather than orphaning. Returns deleted=true. - [List bookable staff members.](https://docs.dmly.io/api-reference/staff/list-bookable-staff-members.md): Returns a paginated list of staff members, ordered by sort_order then name. Supports search and active/accepts_bookings filters. - [Create a staff member.](https://docs.dmly.io/api-reference/staff/create-a-staff-member.md): Creates a bookable staff member. Only name is required; accepts_bookings and active default to true. Returns 201 with the created staff. - [Retrieve a single staff member.](https://docs.dmly.io/api-reference/staff/retrieve-a-single-staff-member.md): Returns the staff member identified by its uuid. - [Update a staff member.](https://docs.dmly.io/api-reference/staff/update-a-staff-member.md): Updates the staff member identified by its uuid. All fields are optional; only supplied fields are changed. Also accepts PATCH. - [Delete a staff member.](https://docs.dmly.io/api-reference/staff/delete-a-staff-member.md): Deletes the staff member identified by its uuid. Returns {"deleted": true}. - [Get a staff member's availability.](https://docs.dmly.io/api-reference/staff/get-a-staff-members-availability.md): Returns the staff member's weekly working-hours rules (day_of_week 0=Sun..6=Sat with HH:MM start/end in the staff timezone) plus any one-off overrides (block / time_off / extra). Optional from/to dates constrain which overrides are returned; the weekly rules are always returned in full. - [Add time off for a staff member.](https://docs.dmly.io/api-reference/staff/add-time-off-for-a-staff-member.md): Creates an availability override of type time_off for the staff member, subtracting hours over the given UTC window. starts_at and ends_at are required (ends_at must be >= starts_at). Returns 201 with the created override. - [Delete a staff member's time off.](https://docs.dmly.io/api-reference/staff/delete-a-staff-members-time-off.md): Deletes the availability override (identified by its uuid) belonging to the given staff member. Returns {"deleted": true}. - [List group-class sessions.](https://docs.dmly.io/api-reference/classes/list-group-class-sessions.md): Returns a paginated list of group-class sessions (one occurrence of a class Service, each with a seat pool), ordered by start time. Scoped automatically to the authenticated workspace. The Service and host staff are embedded as lightweight objects and a participants_count is included. - [Create a group-class session.](https://docs.dmly.io/api-reference/classes/create-a-group-class-session.md): Creates one occurrence of a class Service: a fixed time window with a seat pool. service_id is required (Service uuid); staff_id is the optional host (staff uuid). If ends_at is omitted it is derived from the Service duration. capacity defaults to the Service capacity and waitlist_enabled defaults t… - [Retrieve a single group-class session.](https://docs.dmly.io/api-reference/classes/retrieve-a-single-group-class-session.md): Returns one group-class session by its uuid, with the embedded Service, host staff and participants_count. - [Update a group-class session.](https://docs.dmly.io/api-reference/classes/update-a-group-class-session.md): Updates a group-class session by its uuid. All fields are optional; only supplied fields change. Accepts staff_id (uuid or null), starts_at, ends_at, capacity, location, waitlist_enabled, timezone and status (scheduled/cancelled/completed). PATCH is also accepted. - [Delete a group-class session.](https://docs.dmly.io/api-reference/classes/delete-a-group-class-session.md): Deletes a group-class session by its uuid. Returns {"deleted": true}. - [List a session's participants.](https://docs.dmly.io/api-reference/classes/list-a-sessions-participants.md): Returns a paginated list of the session's participants — confirmed seats first, then the waitlist in position order. Each participant embeds its contact via the shared contact resource. - [Book a contact into a session.](https://docs.dmly.io/api-reference/classes/book-a-contact-into-a-session.md): Books a contact (by uuid) into the session via the class booking service, reserving a seat under a capacity lock or — when the class is full and waitlisting is enabled — a waitlist place. Returns the created participant (201). If the booking cannot proceed (e.g. class_full, already_booked, not_booka… - [Cancel a participant's place.](https://docs.dmly.io/api-reference/classes/cancel-a-participants-place.md): Cancels a participant's place by its uuid via the class booking service. Freeing a confirmed seat returns it to the pool and promotes the next waitlisted contact. Returns {"deleted": true}. - [List products in the Offerings catalogue.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/list-products-in-the-offerings-catalogue.md): Returns a paginated list of products (sellable goods) ordered by sort_order then name. Each product is workspace-scoped automatically. Supports keyword, active, low-stock and category filters. - [Create a product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/create-a-product.md): Creates a product via the OfferingService write seam (records the stock ledger opening balance when tracking stock and fires the ProductCreated event). category_id, when supplied, is a ServiceCategory uuid. Returns 201 with the created product. - [Get a single product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/get-a-single-product.md): Returns one product resolved by its uuid, with its category embedded. - [Update a product (PUT or PATCH).](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/update-a-product-put-or-patch.md): Updates a product via the OfferingService write seam. When the product tracks stock and stock_quantity is supplied, the stock level is reset through the ledger; turning track_stock off clears the quantity. Fires the ProductUpdated event. category_id is a ServiceCategory uuid. - [Delete a product.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/delete-a-product.md): Deletes a product and its stock movements. A product bundled into a plan is deactivated instead of deleted to preserve referential integrity; in that case the response is {deleted:false} with an explanatory message. - [List plans/packages in the Offerings catalogue.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/list-planspackages-in-the-offerings-catalogue.md): Returns a paginated list of plans (one-time packages or recurring memberships) ordered by sort_order then name, with category and granted line items embedded. Workspace-scoped automatically. - [Create a plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/create-a-planpackage.md): Creates a plan via the OfferingService write seam (syncs line items and fires PlanCreated/PlanActivated events). For recurring plans, billing_interval defaults to month and interval_count to 1 when omitted. Each item references a service/product by uuid; credit items grant a credit pool. category_id… - [Get a single plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/get-a-single-planpackage.md): Returns one plan resolved by its uuid, with its category and granted line items (services, products, credits) embedded. - [Update a plan/package (PUT or PATCH).](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/update-a-planpackage-put-or-patch.md): Updates a plan via the OfferingService write seam. When items are supplied they fully replace the plan's existing line items. Fires PlanUpdated and PlanActivated/PlanDeactivated when the active flag changes. category_id is a ServiceCategory uuid. - [Delete a plan/package.](https://docs.dmly.io/api-reference/offerings-—-products-&-plans/delete-a-planpackage.md): Deletes a plan and its line items. Returns {deleted:true}. - [List invoices for the workspace.](https://docs.dmly.io/api-reference/finance-—-invoices/list-invoices-for-the-workspace.md): Returns a paginated list of invoices, most recent first, each with its embedded contact and inline line items. Filter by status, contact (uuid) and issue-date range. - [Create a draft invoice from line items.](https://docs.dmly.io/api-reference/finance-—-invoices/create-a-draft-invoice-from-line-items.md): Creates a draft invoice from snapshotted line items via InvoiceService::createFromLineItems. contact_id is the optional contact uuid; supplying it converts the contact to a client. Each line item snapshots name/unit_price/tax at invoice time. Totals are computed server-side. Returns 201 with the cre… - [Retrieve a single invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/retrieve-a-single-invoice.md): Returns one invoice by its uuid, including the embedded contact and inline line items (name, unit_price, quantity, total). - [Send (finalise) an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/send-finalise-an-invoice.md): Finalises a draft invoice to 'sent' and posts the statement debit via InvoiceService::send. No-op on an already-void invoice. Returns the updated invoice. - [Record a manual payment against an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/record-a-manual-payment-against-an-invoice.md): Records a manual payment for the invoice's contact via PaymentService::recordManual (provider=manual, advanced to succeeded) then recomputes the invoice's paid/due/status via InvoiceService::recordPayment. Fails with 422 if the invoice has no contact. Returns the updated invoice. - [Void an invoice.](https://docs.dmly.io/api-reference/finance-—-invoices/void-an-invoice.md): Voids the invoice (never deletes) via InvoiceService::void, posting an offsetting statement credit for any still-open receivable. No-op on an already-void invoice. Returns the updated invoice. - [List orders (paginated).](https://docs.dmly.io/api-reference/finance-—-orders/list-orders-paginated.md): Returns the workspace's internal orders, newest first, with the embedded contact and snapshotted line items. Filterable by status and contact. - [Create a draft order from offering/custom selections.](https://docs.dmly.io/api-reference/finance-—-orders/create-a-draft-order-from-offeringcustom-selections.md): Builds a new draft order via OrderService::createFromOfferings. Each item is a selection: type service|product|plan resolves the offering by its uuid (catalogue price/tax, optionally overridden), or type custom for a free-form line. Prices, tax and totals are computed server-side; an optional coupon… - [Retrieve a single order.](https://docs.dmly.io/api-reference/finance-—-orders/retrieve-a-single-order.md): Returns one order by its uuid, with the embedded contact and snapshotted line items. - [Confirm an order.](https://docs.dmly.io/api-reference/finance-—-orders/confirm-an-order.md): Confirms a draft order via OrderService::confirm, moving it to confirmed and decrementing tracked product stock exactly once per line item. Cancelled or refunded orders are returned unchanged. Returns the updated order. - [Cancel an order.](https://docs.dmly.io/api-reference/finance-—-orders/cancel-an-order.md): Cancels an order via OrderService::cancel, restoring any product stock that was decremented on confirmation and clawing back loyalty earned. Returns the updated order. - [List payments in the unified ledger.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/list-payments-in-the-unified-ledger.md): Returns a paginated list of payments (manual + gateway) for the current workspace, newest first. Each payment embeds its contact and, when present, a lightweight invoice reference. Supports filtering by status, contact, and payment-date range. - [Record a manual payment for a contact.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/record-a-manual-payment-for-a-contact.md): Records a manual (non-gateway) payment via PaymentService::recordManual. The payment is advanced straight to succeeded through the same path as a gateway webhook, posting a statement credit, converting the contact to a client, and updating their balance/LTV. Returns the created payment (201). - [Retrieve a single payment.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/retrieve-a-single-payment.md): Returns a single payment resolved by its uuid, with the embedded contact and invoice reference. - [Refund a payment (full or partial).](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/refund-a-payment-full-or-partial.md): Refunds a succeeded payment via PaymentService::refund. Posts an offsetting statement debit (never deletes the row), updates any linked invoice, and claws back loyalty earned. Omit amount for a full refund or supply a partial amount. Returns the updated payment. - [List discount coupons.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/list-discount-coupons.md): Returns a paginated list of discount coupons for the current workspace, newest first. Supports a free-text code search and an active filter. - [Create a discount coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/create-a-discount-coupon.md): Creates a coupon. The code is uppercased; a percent-type value is capped at 100%. Returns the created coupon (201). - [Retrieve a single coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/retrieve-a-single-coupon.md): Returns a single coupon resolved by its uuid. - [Update a discount coupon (PUT or PATCH).](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/update-a-discount-coupon-put-or-patch.md): Updates a coupon resolved by its uuid. Accepts the same body as create; the code is uppercased and a percent-type value is capped at 100%. Returns the updated coupon. - [Delete a discount coupon.](https://docs.dmly.io/api-reference/finance-—-payments-&-coupons/delete-a-discount-coupon.md): Deletes a coupon resolved by its uuid. Returns {"deleted": true}. - [List subscriptions for the workspace.](https://docs.dmly.io/api-reference/finance-—-subscriptions/list-subscriptions-for-the-workspace.md): Returns a paginated list of the workspace's subscriptions, newest first. Filter by status and/or contact. Each item embeds its contact (full ContactResource) and a lightweight plan object. - [Subscribe a contact to a plan.](https://docs.dmly.io/api-reference/finance-—-subscriptions/subscribe-a-contact-to-a-plan.md): Creates a subscription for a contact from a plan. Billing cadence, granted contents and (by default) price/currency are snapshotted from the plan; price and currency may be overridden. Credits are granted into the contact's credit ledger and the contact is converted to a client. Returns the created… - [Retrieve a single subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/retrieve-a-single-subscription.md): Returns one subscription by its uuid, with the embedded contact and plan. - [Pause an active subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/pause-an-active-subscription.md): Pauses the subscription if it is currently active (no-op otherwise). Returns the updated subscription. - [Resume a paused subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/resume-a-paused-subscription.md): Resumes the subscription if it is currently paused (no-op otherwise). Returns the updated subscription. - [Cancel a subscription.](https://docs.dmly.io/api-reference/finance-—-subscriptions/cancel-a-subscription.md): Cancels the subscription (clearing its next billing date) if it is not already cancelled. Returns the updated subscription. - [Change a subscription's plan.](https://docs.dmly.io/api-reference/finance-—-subscriptions/change-a-subscriptions-plan.md): Moves the subscription to a different plan (identified by its uuid). effective controls when the change lands: 'now' switches immediately, 'next_renewal' (the default) defers it to the next billing date. proration defaults to true and, when switching now, applies a credit or charge for the unused po… - [List gift cards.](https://docs.dmly.io/api-reference/gift-cards/list-gift-cards.md): Returns a paginated list of the workspace's gift cards, newest first. Filter by a code substring and/or status. Each item exposes the purchaser and recipient contact uuids when they are set. - [Sell or issue a gift card.](https://docs.dmly.io/api-reference/gift-cards/sell-or-issue-a-gift-card.md): Creates a gift card. By default the card is sold to a purchaser (required) and a purchase invoice is minted and sent. Pass comp=true to issue a complimentary card instead, with no purchaser and no billing. value and currency are required; a recipient and an expiry are optional. Returns the created g… - [Redeem a gift card against an invoice.](https://docs.dmly.io/api-reference/gift-cards/redeem-a-gift-card-against-an-invoice.md): Draws a gift card (identified by its code) against an invoice (identified by its uuid), recording a gift_card payment that settles the invoice. An optional amount caps how much to draw; otherwise the lesser of the card balance and the invoice's amount due is applied. Responds with the redeemed amoun… - [Retrieve a single gift card.](https://docs.dmly.io/api-reference/gift-cards/retrieve-a-single-gift-card.md): Returns the gift card identified by its uuid, including its code, status, initial and remaining value, currency and the linked purchaser/recipient contact uuids. - [Get the workspace's first webhook endpoint.](https://docs.dmly.io/api-reference/webhooks/get-the-workspaces-first-webhook-endpoint.md): Returns one outbound webhook endpoint: the destination endpoint URL, the list of subscribed event topics, the channel scope, the connection status (connected/disconnected/error), and whether a signing secret is set (has_secret). The signing secret value itself is never returned. A workspace can have… - [Update the workspace's first webhook endpoint.](https://docs.dmly.io/api-reference/webhooks/update-the-workspaces-first-webhook-endpoint.md): Saves the workspace's FIRST outbound webhook endpoint and marks it connected. It overwrites that endpoint's URL, events, channel scope and secret rather than registering an additional endpoint, so it can silently replace an endpoint someone configured in the dashboard. To run more than one endpoint,… - [Disconnect the workspace's first webhook endpoint.](https://docs.dmly.io/api-reference/webhooks/disconnect-the-workspaces-first-webhook-endpoint.md): Disconnects the workspace's FIRST outbound webhook endpoint: clears its endpoint, subscribed events, channel scope and signing secret, and sets its status to disconnected. Any other webhook endpoint in the workspace keeps delivering. No further events go to this one until a new subscription is saved… - [List the full subscribable event catalogue, grouped.](https://docs.dmly.io/api-reference/webhooks/list-the-full-subscribable-event-catalogue-grouped.md): Returns the complete catalogue of webhook event topics you can subscribe to, organised into ordered display groups (Contacts & clients, Conversations, Message lifecycle, Appointments, Classes, Invoices, Orders, Payments, Subscriptions, Offerings & credits, Store, Automations, Broadcasts). Each group… - [List media library items (paginated).](https://docs.dmly.io/api-reference/media/list-media-library-items-paginated.md): Returns the workspace's media library (images, videos, gifs), newest first. Workspace scoping is automatic. Supports an optional name search and standard pagination. - [Upload a file to the media library.](https://docs.dmly.io/api-reference/media/upload-a-file-to-the-media-library.md): Uploads a single file via multipart/form-data and creates a Media record. Reuses the dashboard upload pipeline (storage on the configured disk plus thumbnail/video conversions). Returns the created media item with HTTP 201. Send the request as multipart/form-data with a 'file' part (not JSON). - [Retrieve a single media item.](https://docs.dmly.io/api-reference/media/retrieve-a-single-media-item.md): Returns one media item resolved by its public id (uuid). 404 if it does not exist in the current workspace. - [Delete a media item.](https://docs.dmly.io/api-reference/media/delete-a-media-item.md): Detaches the media from any post versions that reference it, deletes the underlying files (including conversions) from storage, then removes the record. Returns {"deleted": true}. - [New contact](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/new-contact.md): Sent to your endpoint when **New contact** occurs (`contact.created`). - [Contact updated](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/contact-updated.md): Sent to your endpoint when **Contact updated** occurs (`contact.updated`). - [Tag added](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/tag-added.md): Sent to your endpoint when **Tag added** occurs (`contact.tagged`). - [Tag removed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/tag-removed.md): Sent to your endpoint when **Tag removed** occurs (`contact.untagged`). - [Pipeline stage changed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/pipeline-stage-changed.md): Sent to your endpoint when **Pipeline stage changed** occurs (`contact.stage_changed`). - [Lifecycle changed](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/lifecycle-changed.md): Sent to your endpoint when **Lifecycle changed** occurs (`contact.lifecycle_changed`). - [Became a client](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/became-a-client.md): Sent to your endpoint when **Became a client** occurs (`contact.converted_to_client`). - [Birthday key date](https://docs.dmly.io/api-reference/webhooks-contacts-and-clients/birthday-key-date.md): Sent to your endpoint when **Birthday / key date** occurs (`contact.date_reached`). - [Inbound message received](https://docs.dmly.io/api-reference/webhooks-conversations/inbound-message-received.md): Sent to your endpoint when **Inbound message received** occurs (`message.received`). - [Conversation assigned](https://docs.dmly.io/api-reference/webhooks-conversations/conversation-assigned.md): Sent to your endpoint when **Conversation assigned** occurs (`conversation.assigned`). - [Conversation closed](https://docs.dmly.io/api-reference/webhooks-conversations/conversation-closed.md): Sent to your endpoint when **Conversation closed** occurs (`conversation.closed`). - [Incoming call](https://docs.dmly.io/api-reference/webhooks-calls/incoming-call.md): Sent to your endpoint when **Incoming call** occurs (`call.incoming`). - [Call completed](https://docs.dmly.io/api-reference/webhooks-calls/call-completed.md): Sent to your endpoint when **Call completed** occurs (`call.completed`). - [Missed call](https://docs.dmly.io/api-reference/webhooks-calls/missed-call.md): Sent to your endpoint when **Missed call** occurs (`call.missed`). - [Call declined](https://docs.dmly.io/api-reference/webhooks-calls/call-declined.md): Sent to your endpoint when **Call declined** occurs (`call.rejected`). - [Message sent](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-sent.md): Sent to your endpoint when **Message sent** occurs (`message.sent`). - [Message delivered](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-delivered.md): Sent to your endpoint when **Message delivered** occurs (`message.delivered`). - [Message read seen](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-read-seen.md): Sent to your endpoint when **Message read / seen** occurs (`message.read_or_seen`). - [Message failed](https://docs.dmly.io/api-reference/webhooks-message-lifecycle/message-failed.md): Sent to your endpoint when **Message failed** occurs (`message.failed`). - [Appointment scheduled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-scheduled.md): Sent to your endpoint when **Appointment scheduled** occurs (`booking.created`). - [Appointment confirmed](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-confirmed.md): Sent to your endpoint when **Appointment confirmed** occurs (`appointment.confirmed`). - [Appointment rescheduled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-rescheduled.md): Sent to your endpoint when **Appointment rescheduled** occurs (`booking.rescheduled`). - [Appointment cancelled](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-cancelled.md): Sent to your endpoint when **Appointment cancelled** occurs (`booking.cancelled`). - [Appointment completed](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-completed.md): Sent to your endpoint when **Appointment completed** occurs (`appointment.completed`). - [Appointment no show](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-no-show.md): Sent to your endpoint when **Appointment no-show** occurs (`appointment.no_show`). - [Appointment reminder due](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-reminder-due.md): Sent to your endpoint when **Appointment reminder due** occurs (`appointment.reminder_due`). - [Appointment starts soon](https://docs.dmly.io/api-reference/webhooks-appointments/appointment-starts-soon.md): Sent to your endpoint when **Appointment starts soon** occurs (`appointment.starts_soon`). - [Class booked](https://docs.dmly.io/api-reference/webhooks-classes/class-booked.md): Sent to your endpoint when **Class booked** occurs (`class.booked`). - [Class cancelled](https://docs.dmly.io/api-reference/webhooks-classes/class-cancelled.md): Sent to your endpoint when **Class cancelled** occurs (`class.cancelled`). - [Joined class waitlist](https://docs.dmly.io/api-reference/webhooks-classes/joined-class-waitlist.md): Sent to your endpoint when **Joined class waitlist** occurs (`class.waitlisted`). - [Class seat opened](https://docs.dmly.io/api-reference/webhooks-classes/class-seat-opened.md): Sent to your endpoint when **Class seat opened** occurs (`class.seat_opened`). - [Class full](https://docs.dmly.io/api-reference/webhooks-classes/class-full.md): Sent to your endpoint when **Class full** occurs (`class.full`). - [Class starts soon](https://docs.dmly.io/api-reference/webhooks-classes/class-starts-soon.md): Sent to your endpoint when **Class starts soon** occurs (`class.starts_soon`). - [Invoice created draft](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-created-draft.md): Sent to your endpoint when **Invoice created (draft)** occurs (`invoice.created`). - [Invoice sent](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-sent.md): Sent to your endpoint when **Invoice sent** occurs (`invoice.sent`). - [Invoice partially paid](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-partially-paid.md): Sent to your endpoint when **Invoice partially paid** occurs (`invoice.partially_paid`). - [Invoice fully paid](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-fully-paid.md): Sent to your endpoint when **Invoice fully paid** occurs (`invoice.paid`). - [Invoice overdue](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-overdue.md): Sent to your endpoint when **Invoice overdue** occurs (`invoice.overdue`). - [Invoice voided](https://docs.dmly.io/api-reference/webhooks-invoices/invoice-voided.md): Sent to your endpoint when **Invoice voided** occurs (`invoice.voided`). - [Order created](https://docs.dmly.io/api-reference/webhooks-orders/order-created.md): Sent to your endpoint when **Order created** occurs (`order.created`). - [Order confirmed](https://docs.dmly.io/api-reference/webhooks-orders/order-confirmed.md): Sent to your endpoint when **Order confirmed** occurs (`order.confirmed`). - [Order paid](https://docs.dmly.io/api-reference/webhooks-orders/order-paid.md): Sent to your endpoint when **Order paid** occurs (`order.paid`). - [Order cancelled](https://docs.dmly.io/api-reference/webhooks-orders/order-cancelled.md): Sent to your endpoint when **Order cancelled** occurs (`order.cancelled`). - [Payment succeeded](https://docs.dmly.io/api-reference/webhooks-payments/payment-succeeded.md): Sent to your endpoint when **Payment succeeded** occurs (`payment.succeeded`). - [Payment failed](https://docs.dmly.io/api-reference/webhooks-payments/payment-failed.md): Sent to your endpoint when **Payment failed** occurs (`payment.failed`). - [Payment refunded](https://docs.dmly.io/api-reference/webhooks-payments/payment-refunded.md): Sent to your endpoint when **Payment refunded** occurs (`payment.refunded`). - [Subscription created](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-created.md): Sent to your endpoint when **Subscription created** occurs (`subscription.created`). - [Subscription renewed](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-renewed.md): Sent to your endpoint when **Subscription renewed** occurs (`subscription.renewed`). - [Subscription plan changed](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-plan-changed.md): Sent to your endpoint when **Subscription plan changed** occurs (`subscription.plan_changed`). - [Subscription paused](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-paused.md): Sent to your endpoint when **Subscription paused** occurs (`subscription.paused`). - [Subscription cancelled](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-cancelled.md): Sent to your endpoint when **Subscription cancelled** occurs (`subscription.cancelled`). - [Subscription payment failed](https://docs.dmly.io/api-reference/webhooks-subscriptions/subscription-payment-failed.md): Sent to your endpoint when **Subscription payment failed** occurs (`subscription.payment_failed`). - [Credits issued](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-issued.md): Sent to your endpoint when **Credits issued** occurs (`credits.issued`). - [Credits used](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-used.md): Sent to your endpoint when **Credits used** occurs (`credits.used`). - [Credits low](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/credits-low.md): Sent to your endpoint when **Credits low** occurs (`credits.low`). - [Coupon redeemed](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/coupon-redeemed.md): Sent to your endpoint when **Coupon redeemed** occurs (`coupon.redeemed`). - [Loyalty points activity](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/loyalty-points-activity.md): Sent to your endpoint when **Loyalty points activity** occurs (`loyalty.transaction`). - [Product stock low](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/product-stock-low.md): Sent to your endpoint when **Product stock low** occurs (`offering.stock_low`). - [Product back in stock](https://docs.dmly.io/api-reference/webhooks-offerings-and-credits/product-back-in-stock.md): Sent to your endpoint when **Product back in stock** occurs (`offering.back_in_stock`). - [Store order placed](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-placed.md): Sent to your endpoint when **Store order placed** occurs (`store.order_created`). - [Store order paid](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-paid.md): Sent to your endpoint when **Store order paid** occurs (`store.order_paid`). - [Store payment failed](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-payment-failed.md): Sent to your endpoint when **Store payment failed** occurs (`store.payment_failed`). - [Checkout abandoned](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/checkout-abandoned.md): Sent to your endpoint when **Checkout abandoned** occurs (`store.checkout_abandoned`). - [Store order shipped](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-shipped.md): Sent to your endpoint when **Store order shipped** occurs (`store.order_fulfilled`). - [Store order cancelled](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-cancelled.md): Sent to your endpoint when **Store order cancelled** occurs (`store.order_cancelled`). - [Store order refunded](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/store-order-refunded.md): Sent to your endpoint when **Store order refunded** occurs (`store.order_refunded`). - [Product back in stock store](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/product-back-in-stock-store.md): Sent to your endpoint when **Product back in stock (store)** occurs (`store.product_back_in_stock`). - [Inventory low](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/inventory-low.md): Sent to your endpoint when **Inventory low** occurs (`store.inventory_low`). - [Customer milestone](https://docs.dmly.io/api-reference/webhooks-store-e-commerce/customer-milestone.md): Sent to your endpoint when **Customer milestone** occurs (`store.customer_milestone`). - [Automation triggered](https://docs.dmly.io/api-reference/webhooks-automations/automation-triggered.md): Sent to your endpoint when **Automation triggered** occurs (`automation.triggered`). - [Automation completed](https://docs.dmly.io/api-reference/webhooks-automations/automation-completed.md): Sent to your endpoint when **Automation completed** occurs (`automation.completed`). - [Automation failed](https://docs.dmly.io/api-reference/webhooks-automations/automation-failed.md): Sent to your endpoint when **Automation failed** occurs (`automation.failed`). - [Broadcast sent](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-sent.md): Sent to your endpoint when **Broadcast sent** occurs (`broadcast.sent`). - [Broadcast completed](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-completed.md): Sent to your endpoint when **Broadcast completed** occurs (`broadcast.completed`). - [Broadcast failed](https://docs.dmly.io/api-reference/webhooks-broadcasts/broadcast-failed.md): Sent to your endpoint when **Broadcast failed** occurs (`broadcast.failed`). - [Agency API overview](https://docs.dmly.io/api-reference/agency-introduction.md): Provision sub-account workspaces, assign plans and add-ons, and subscribe to lifecycle events: the whitelabel reseller API. - [Agency authentication](https://docs.dmly.io/api-reference/agency-authentication.md): Authenticate the reseller API with an agency key (dmly_ag_…), sent as the x-api-key header. - [Agency webhooks](https://docs.dmly.io/api-reference/agency-webhooks.md): Subscribe to sub-account lifecycle events: DMLY posts a signed envelope to your endpoint as they happen. - [List the agency's sellable plans and add-ons.](https://docs.dmly.io/api-reference/agency-plans/list-the-agencys-sellable-plans-and-add-ons.md): Returns all enabled plans the agency sells, in the agency's configured order (not paginated). Each entry carries uuid, name, type ("base" or "addon"), addon_kind and addon_quantity (non-null only for add-ons), currency, monthly_amount and yearly_amount. Use these uuids as the plan/add-on identifier… - [List the agency's sub-accounts.](https://docs.dmly.io/api-reference/agency-workspaces/list-the-agencys-sub-accounts.md): Returns a paginated list of the agency's sub-account workspace cards, newest first. Supports an optional name search. The response has `data` (an array of cards) plus a `meta` block with current_page, last_page, per_page and total. - [Provision a sub-account workspace.](https://docs.dmly.io/api-reference/agency-workspaces/provision-a-sub-account-workspace.md): Creates an owner user plus a workspace under the agency, on the supplied base-plan uuid or the agency's default plan (its limits are copied onto the workspace). name (the owner's name), business_name (becomes the workspace name), email (must be unique across users) and password (min 8) are required;… - [Retrieve a single sub-account.](https://docs.dmly.io/api-reference/agency-workspaces/retrieve-a-single-sub-account.md): Returns the workspace card for the sub-account identified by its uuid, including the effective `limits` object. 404s if the uuid is not one of the agency's sub-accounts. - [Rename a sub-account.](https://docs.dmly.io/api-reference/agency-workspaces/rename-a-sub-account.md): Renames the sub-account. Only `name` is accepted, and it is required (string, max 100). Returns the updated workspace card. - [Suspend a sub-account.](https://docs.dmly.io/api-reference/agency-workspaces/suspend-a-sub-account.md): Locks the sub-account so its team can no longer sign in. Takes no request body. Returns the workspace card with status "suspended". Fires the workspace.suspended webhook. - [Restore a suspended sub-account.](https://docs.dmly.io/api-reference/agency-workspaces/restore-a-suspended-sub-account.md): Unlocks a previously suspended sub-account. Takes no request body. Returns the workspace card with status "active". Fires the workspace.restored webhook. - [Show a sub-account's subscription.](https://docs.dmly.io/api-reference/agency-subscriptions-and-add-ons/show-a-sub-accounts-subscription.md): Returns the sub-account's current subscription as `data`: `{ workspace (uuid), status ("active"|"suspended"), plan ({ uuid, name } or null), addons (array of granted add-ons), limits (the effective merged limits) }`. - [Change a sub-account's base plan.](https://docs.dmly.io/api-reference/agency-subscriptions-and-add-ons/change-a-sub-accounts-base-plan.md): Assigns a new base plan to the sub-account and copies its limits onto the workspace. `plan` is required and must be an enabled base plan belonging to the agency (otherwise 422). Returns the detailed workspace card (including `limits`); a suspended sub-account stays suspended. - [Grant an add-on to a sub-account.](https://docs.dmly.io/api-reference/agency-subscriptions-and-add-ons/grant-an-add-on-to-a-sub-account.md): Grants an add-on (e.g. extra contacts / social account / teammate) on top of the base plan. `plan` is required and must be an enabled add-on plan belonging to the agency; `quantity` is optional (integer 1-1000, default 1). Idempotent per (workspace, add-on plan): a repeat grant SETS the quantity rat… - [Revoke an agency-granted add-on.](https://docs.dmly.io/api-reference/agency-subscriptions-and-add-ons/revoke-an-agency-granted-add-on.md): Revokes an agency-granted add-on (identified by its uuid), reverting the affected limit to the base plan and firing the addon.revoked webhook. Returns `{ "data": { "deleted": true } }`. 404s if the add-on is not an agency-granted add-on on this sub-account. - [List the agency's webhook endpoints.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/list-the-agencys-webhook-endpoints.md): Returns the agency's webhook endpoints as `data` (an array of cards), newest first — not paginated. Each card is `{ uuid, name, url, events, active, has_secret, last_delivery_status, last_delivered_at, created_at }`; the signing secret is never included here. - [Create a webhook endpoint.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/create-a-webhook-endpoint.md): Registers a webhook endpoint. `name` (max 100), `url` (http/https, max 2048, SSRF-guarded) and `events` (a non-empty array whose members must be valid event keys) are required; `active` is optional and defaults to true. Returns 201 with the webhook card plus the signing `secret` (shown this one time… - [List the subscribable webhook events.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/list-the-subscribable-webhook-events.md): Returns the event catalogue as `data`: an array of `{ event, label }` for the six sub-account lifecycle events (workspace.created, workspace.suspended, workspace.restored, subscription.changed, addon.granted, addon.revoked). These are the only values accepted in a webhook's `events` array. - [Retrieve a single webhook endpoint.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/retrieve-a-single-webhook-endpoint.md): Returns the webhook card for the endpoint identified by its uuid (without the secret). 404s if the uuid is not one of the agency's webhooks. - [Update a webhook endpoint.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/update-a-webhook-endpoint.md): Updates the endpoint. Uses the same validation as create, so `name`, `url` and `events` must all be supplied (it is a full replace, not a partial patch); `active` is optional and left unchanged when omitted. Returns the updated webhook card (without the secret). - [Delete a webhook endpoint.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/delete-a-webhook-endpoint.md): Deletes the webhook endpoint identified by its uuid. Returns `{ "data": { "deleted": true } }`. 404s if the uuid is not one of the agency's webhooks. - [Rotate a webhook's signing secret.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/rotate-a-webhooks-signing-secret.md): Mints a new signing secret for the endpoint, invalidating the old one. Takes no request body. Returns the webhook card plus the new `secret` (shown this one time only). - [Send a test event to a webhook.](https://docs.dmly.io/api-reference/agency-webhook-endpoints/send-a-test-event-to-a-webhook.md): Queues a sample delivery so an integrator can verify their endpoint without waiting for a real event. `event` is optional and must be a valid event key (422 otherwise); it defaults to the webhook's first subscribed event, or workspace.created. The sample envelope carries "test": true. The response `… - [Sub account created](https://docs.dmly.io/api-reference/agency-events/sub-account-created.md): Sent to your endpoint when **Sub-account created** occurs (`workspace.created`). - [Sub account suspended](https://docs.dmly.io/api-reference/agency-events/sub-account-suspended.md): Sent to your endpoint when **Sub-account suspended** occurs (`workspace.suspended`). - [Sub account restored](https://docs.dmly.io/api-reference/agency-events/sub-account-restored.md): Sent to your endpoint when **Sub-account restored** occurs (`workspace.restored`). - [Subscription plan changed](https://docs.dmly.io/api-reference/agency-events/subscription-plan-changed.md): Sent to your endpoint when **Subscription (plan) changed** occurs (`subscription.changed`). - [Add on granted](https://docs.dmly.io/api-reference/agency-events/add-on-granted.md): Sent to your endpoint when **Add-on granted** occurs (`addon.granted`). - [Add on revoked](https://docs.dmly.io/api-reference/agency-events/add-on-revoked.md): Sent to your endpoint when **Add-on revoked** occurs (`addon.revoked`). - [MCP overview](https://docs.dmly.io/mcp/overview.md): Connect an AI assistant straight to a DMLY workspace over the Model Context Protocol, instead of wiring up HTTP calls yourself. - [Integrating MCP clients](https://docs.dmly.io/mcp/integrating-clients.md): Connect an MCP client to DMLY by signing in with OAuth or by pasting a scoped API key, and read the failure responses when it does not connect. - [MCP tools reference](https://docs.dmly.io/mcp/tools-reference.md): All 37 DMLY MCP tools and 4 resources, grouped by domain, with their arguments, the key scope they need and the team permission they need. - [Changelog](https://docs.dmly.io/changelog/overview.md): What's new in DMLY: new features, improvements and fixes, newest first. ## OpenAPI Specs - [agency-openapi](/api-reference/agency-openapi.json) - [openapi](/api-reference/openapi.json)