Ask questions, share tips, and discuss best practices about apps and integrations, App builder, APIs, SDKs, ZAF, and Sunshine
Recently active
Full disclosure: I'm the co-founder of Rulebase, so I'm biased here. We shipped an MCP server for Zendesk. Zendesk itself is an MCP client (Copilot can call external tools), but there's no first-party MCP server - so if you want Claude, Cursor, or any MCP client to read your tickets, there's no native way to do it. What it does: - Syncs a read-only copy of your Zendesk conversations into one canonical schema. Zendesk stays the system of record.- Finds repeat contacts from the conversation text itself, not just agent-set fields.- Measures actual complaints, not just the ones agents remembered to tag. We also open-sourced 150 agent skills for CX ops (QA, complaints, churn signal, forecasting, coaching). MIT licensed and vendor-neutral: https://github.com/rulebase-co/rulebase-skills Details: https://www.rulebase.co/mcp/zendesk Happy to answer questions on the schema or the tradeoffs. And if this kind of post isn't welcome here, tell me and I'll take it down.
We have the Sunshine Conversations V2 Messages API working, but when we try to use the Passthrough API, we are getting a "should have required property 'content'" error. Here is the request, payload, and the response: POST: https://api.smooch.io/v2/apps/62d2b047fa1d7700ef4bc9f1/conversations/a63b416485367d8a768f6c6a/messages{"author": {"type": "business"},"content": {"type": "text","text": "Test"},"override": {"apple": {"payload": {"body": "https://smooch.io/","type": "richLink","richLinkData": {"url": "https://smooch.io/","title": "Title","assets": {"video": {"url": "https://images.apple.com/media/us/homepod/2018/98e6cc1a_37ec_4e69_b717_9e58c71e1937/films/expand/homepod-expand-tpl-cc-us-20180306_1280x720h.mp4","mimeType": "video/mp4"}}}}}}}{"errors":[{"code":"bad_request","title":"should have required property 'content'"}]} According to the documentation, the V2 API does support the "override" / passthrough APIs for Apple Business Chat: https://docs.smooch.io/rest/#o
Hi everyone,I'm building a custom Zendesk Top Bar App using the Zendesk Apps Framework (ZAF) for our Zendesk.The app creates tickets successfully and includes a custom attachment component. The UI shows the file as attached, but the attachment never appears on the created Zendesk ticket.Current BehaviourThe attachment component works as expected in the app:File can be selected Drag and drop works Image preview works File displays as "Attached" Ticket is created successfullyExample:![Attachment UI]image of how it looks on the app.However, after the ticket is created:No attachment appears on the ticket No downloadable file is available The ticket comment only contains the text contentWhat We're Currently DoingUser selects a file. File is read as binary. File is uploaded to Zendesk using:POST /api/v2/uploads.json?filename={filename}Upload token is extracted from:response.upload.tokenTicket is then created using:{ "ticket": { "comment": { "body": "Test", "uploads": ["upload_
I am Admin for our ZD instance, and I work on the business side, not IT. Back in a former life, I was a software engineer, but not anymore. So I use Power Automate when I need to do code-like things. I have a number of Power Automate flows that invoke the ZD API (via the HTTP action) and teach myself the API via Postman. Auth for both Power Automate and Postman uses API keys.API key auth is being eliminated for Support.I have no idea how to transition to OAuth for my needs. There is not documentation that provides me any guidance. I have no experience with OAuth, and this looks like something I’ll need IT assistance to set up - but I have no idea what to even ask for. Can someone provide me some guidance?Note that Exploring Zendesk APIs with Postman on the ZD developer website instructs to use API key auth for Postman.
Large full-account exports can look complete and still be difficult to validate. This is the checklist I use before treating an archive as reliable input for review or migration.1. Identify the format of every fileNDJSON contains one JSON object per line, so parsing the whole file with JSON.parse will fail or consume unnecessary memory. ZIP exports may also contain multiple split files, so keep the source filename for every record.2. Normalize a minimum ticket schemaKeep at least the ticket ID, created_at, updated_at, status, subject, requester/assignee/organization IDs, tags, custom_fields, and comment or audit data. Do not assume every export variant uses identical property names.3. Validate the conversation historyCheck public replies versus internal notes, comment order, author IDs, timestamps, and attachment metadata. A ticket record without its full conversation may be unusable even if the ticket count is correct.4. Merge duplicate ticket records carefullyThe same ticket can appe
SummaryZendesk OAuth currently contains a failure scenario that can permanently break an otherwise healthy integration after a single transient infrastructure failure.The issue is not related to OAuth itself, but to the way refresh token rotation is currently implemented.If an application successfully receives a new access token and refresh token pair but cannot persist the new refresh token before an unexpected failure (application crash, database outage, network failure, process termination, etc.), there is no supported way to recover.The integration permanently loses the ability to obtain new access tokens, even though the OAuth authorization itself remains valid.For unattended integrations, this creates a single point of failure that application developers cannot eliminate on their own.Why this matters nowThe published API Token deprecation timeline makes OAuth the only authentication mechanism for the Ticketing, Help Center, and Voice APIs.Once API Tokens are fully retired, this f
Problem Statement Administrators may need to bulk delete tickets, such as when a business unit is sold to another company and their associated data must be incrementally removed. The native Zendesk UI does not allow users to select and perform bulk actions on closed tickets. When needing to purge tickets associated with a sold business unit, clicking into individual closed tickets to delete them via the menu is inefficientWhat makes this app special This app overcomes Zendesk's native UI limitations by enabling bulk deletion of closed tickets directly via the API. It includes built-in safety validation to ensure only tickets with a "closed" status are processed, while handling large volumes through batch processing.Core use cases Deleting closed tickets in bulk by specifying multiple ticket IDs separated by commas, spaces, or newlines. Searching and bulk deleting all closed tickets associated with a specific requester's email address. Purging obsolete closed tickets efficiently aft
Hello all,Three days ago I got an email that tomorrow our API tokens will get deactivated because they weren’t used recently.Our OpsGenie token hasn’t been recently used, because thankfully we didn’t have a customer incident in the last few months.Unfortunately there isn’t a clear way to force keep an API token activated. So tomorrow, our OpsGenie integration stops working unless we keep rotating our API tokens? Is there any other way to do it?This is one of the most critical systems for us. Not responding to a ticket within an SLA means we breach our contractual obligations. And all these happen with just 4 days of notice in advance!Thank you for any help you migh be able to provide regarding this.
One of my customer uses salesforce integration to crate ticket from salesforce to zendesk. But one partner's salesforce account of my customer is facing a issue with the error. When the partner click the setting for login zendeks account in salesforce page, the below error message pops-up. Other accounts works well (to login zendesk account, to create ticket from salesforce) I guess the reason is related to role or permission of account. How can i resolve this issue?
Hi All I want to launch a global oauth app in Zendesk marketplace, but now I'm stuck because I don't know how to proceed with the application. Here is my current application progress:1. Does the app use a global Oauth client? Yes2. Please provide the "client_id" for the global oauth client. I’m not sure how to get the "client_id" in Zendesk3. Have you associated the global oauth client with your app following the instructions here? No, we currently use a per-customer confidential client.4. Have you implemented the refresh token grant type? No. We utilize the Client Credentials Grant Type instead. The app securely calls the /oauth/tokens endpoint directly in the background using each customer's specific client_id and client_secret to obtain a new access token.5. Does the app have API headers implemented as required? No
Hi allI’ve read and re-read the Action Flows articles and tried to make some basic ones of my own but I just don’t understand what I’m doing wrong or what all the technical terms mean. I’m not a developer, I’m an admin trying to build basic things like “If a ticket has a specific tag added to it, add this task list to it” but I just can’t figure it out. The inputs, variables and all the other things are so complicated to understand.I don’t see an Academy course for Action Flows and all the videos I can find that talk about it are very high level and don’t explain everything that I’m seeing. Is there any content I’m missing or can an Academy course be made for this? I like to think I’m at least of average intelligence but I just can’t wrap my head around Action Flows!Thanks!
Hi everyone,I am looking for some architectural clarity from the community and the Zendesk product team regarding how Zendesk Classic Chat compares to Zendesk Messaging when handling mobile browser lifecycles - specifically on iOS Safari.Our Context & ProblemWe run a virtual healthcare platform where maintaining a stable virtual waiting room/routing queue is critical to patient care. Currently, we are using the Zendesk Classic Web Widget.We are facing a severe issue with mobile users (specifically on iOS). When a user enters the chat queue, looks away to check another app, or switches tabs in Safari, iOS aggressively freezes the JavaScript execution context to save battery. In Classic Chat, this causes the live WebSocket connection to drop. Within 20 seconds to a couple of minutes, the Zendesk server flags the user as offline, removes their session, and drops them entirely from the active routing queue. When the user switches back to our tab, the widget attempts to reconnect, b
A question that comes up here regularly is some version of "we're moving off Zendesk into Jira – how do we do it without losing our ticket history?"I wanted to put together a full walkthrough covering the whole thing: why teams migrate, what actually carries over, where it breaks, and a process that reduces the pain. Why teams make the moveThe pattern is consistent. Teams already standardized on Atlassian want support data closer to engineering, product, and ops; they want to cut tool sprawl and licensing complexity; and they want centralized reporting instead of a separate support island. Once migrated, Zendesk tickets usually become Jira work items used across support, product, or service management – that flexibility is a big part of why Jira wins as the long-term home.What actually carries overWhether you can preserve everything depends on your environment, your target Jira config, and your approach – but a well-planned migration moves far more than ticket summaries. The rough mapp
We observed an intermittent Web Widget Messaging issue involving native Basicresponses, a required category form, and multiple conversations. This channeldoes not use an AI Agent or Flow Builder bot.Zendesk Support asked us to bring the reproduction to the Platform andDeveloper community. Configuration- Product: Zendesk Messaging Web Widget- Response type: native Basic response- AI Agent / Flow Builder: none- Multiple conversations: enabled- Authenticated end user through zE("messenger", "loginUser", ...)- Conversation created either through the native New conversation control or zE("messenger:ui", "newConversation", ...)The Basic response sends a required category form withblockChatInput: true before handing the conversation to Support.Original failureThe issue reproduced on July 10, 2026:1. Start a new authenticated conversation.2. Wait for the native Basic response greeting and required category form.3. Confirm that the composer is unavailable.4. Do not answer the form.5. Refresh t
Hello, Following your announcement of the removal of API tokens as an authenticationmethod (article 10851263566234: auto-deactivation of unused tokens on2026-07-28, no new tokens after 2026-10-27, full EOL on 2027-04-30), we haveproactively migrated our integrations to OAuth. Our main server-to-serverapplication now authenticates exclusively with client_credentials accesstokens, and we are migrating our remaining API tokens one by one. However, we have identified one integration paths for which no OAuthmigration option currently exists, and we need your guidance on both. We provision our Zendesk users and groups from Microsoft Entra ID using theofficial Zendesk connector from the Microsoft Entra application gallery. Asdocumented by Microsoft(https://learn.microsoft.com/entra/identity/saas-apps/zendesk-provisioning-tutorial),this connector only supports Admin Username + Secret Token (a Zendesk APItoken) for authentication. There is no OAuth option on the Microsoft side. This means that
I am looking to see if I’am missing something, but can action flows access the ticket notes natively or do I need to make a custom API call. The custom API call uses more API credits, so it’s less appealing, but I have it working.
In one of my apps I’m trying to have the app create 2 custom objects (v2). To do that I’m including a requirements.json file in my app and specifying the creation of the 2 objects. When you use custom objects by default 2 standard fields get created, Name and ExternalId. The issue I am running into is that when I try to specify the autoincrement settings for Name or add a description for ExternalId the app fails to install. I’m assuming because the custom object believes I’m asking for a duplicate field to be set where as all I’m trying to do is set the autoincrement on the Name and a description on the ExternalId. Things that I can easily do in the UI but since this is an app I cannot go the UI route.I have code similar to this:{ "custom_objects_v2": { "objects": [ { "key": "object_1", "include_in_list_view": false, "title": Object 1", "title_pluralized": "Object 1", "description": "object
Problem Statement Administrators often need to bulk delete users, such as when a business unit is sold to another company and their associated data must be incrementally removed. Currently, taking an exported list of users from Zendesk Explore and removing them manually is time-consuming and inefficient.What makes this app special This app bypasses complex CSV file uploads and unnecessary safety confirmations, as it is designed strictly for admin use. It features a streamlined interface optimized for narrow spaces, allowing an admin to directly paste a raw list of email addresses, automatically handling duplicate removal and API rate limits by processing in batches.Core use cases Bulk deleting obsolete end-user profiles after a business unit is sold off. Pairing with a similar app used to bulk-delete closed tickets associated with the sold business unit. Processing batch deletions directly from a Zendesk Explore export copy-paste. Location of appSide Navigation, for complex apps th
Problem Statement Native reporting tools often require navigating away from the core Zendesk workspace and rely on periodic data refreshes. Support managers and team leads need real-time, interactive insights into agent workloads, handle times, and organization-level support efforts directly within the Zendesk interface, with the ability to instantly drill down into the underlying tickets.What makes this app special This app bridges the gap between high-level analytics and actionable ticket management. It utilizes the Zendesk Search API to pull real-time data while securely bypassing iframe limitations using native ZAF Client routing. It dynamically calculates team benchmarks based solely on active human agents (filtering out bots and AI integrations), distinctly separates "actionable" tickets from those blocked by engineering or third parties, and provides a dual-axis view of performance by either Agent or Organization.Prerequisites Before pasting the prompt into the App Builder, repl
Problem StatementExporting a large volume of end users based on specific tags often results in pagination limits, API rate limit errors, and missing organization data. Standard API searches cap out or fail to sideload organizations properly. This app provides a direct, highly resilient solution for extracting up to 5,000+ end-user records into a CSV file directly from the Zendesk interface.What makes this app special Cursor-Based Pagination & Rate Limit Handling: The app actively monitors for 429 Too Many Requests errors and utilizes the Retry-After header to pause and automatically retry requests, safely processing 5,000+ users without crashing. Organization Data Resolution: The standard Search API does not support organization sideloading. This app performs a secondary batch request (show_many) in the background to ensure organization names are accurately populated in the final CSV. Strict End-User Filtering: The API query enforces a role:end-user filter, preventing internal
We have been using a React Native wrapper for Zendesk Messaging:https://github.com/leegeunhyeok/react-native-zendesk-messaging/tree/mainThe wrapper’s most recent change was made about a year ago. Recently, however, we have received multiple reports of users suddenly being unable to send messages. When this occurs, the message displays a “Tap to retry” option, but retrying does not successfully resend it.Since there have been no recent changes to the wrapper, we would like to ask whether there have been any upstream changes to the Zendesk Messaging SDK or service that could be causing the wrapper to fail intermittently.At the moment, restarting the app resolves the issue for most users, allowing them to send messages normally again. However, there are still some cases where users continue to see the same “Tap to retry” error even after restarting the app.From the development side, we have not been able to reproduce the “Tap to retry” failure consistently, which has made it difficult to
is Oauth token expiration for oauth using client credentials grant type also? I am trying to create a new OAuth client using client credentials to test token expiry and obtain new tokens. But get not a valid grant type error. Is the grant type restricted to only one oAuth client?URL used is url = "https://gsmls.zendesk.com/oauth/tokens”If i use the existing Oauth client to get token get below error“{"error":"unauthorized_client","error_description":"The authenticated client is not authorized to use the access grant “
Problem StatementThe iFrame app is a ticket sidebar application that provides embedded access to external web content directly within the ticket context. It dynamically renders a configurable URL inside the sidebar, allowing agents to interact with external tools and workflows without leaving the ticket view. Location: nav bar. PromptCreate a nav_bar app called "Iframe" that embeds an admin-configured external website inside Zendesk Support, allowing agents to quickly navigate to an external resource and return to their tickets without interrupting their workflow.The app requires one install-time setting: **Iframe URL** (parameter name `iframeURL`, type: url, required). This is the external website address the admin enters during installation. On load, retrieve the setting by calling `const metadata = await zafClient.metadata()` and reading `metadata.settings.iframeURL`. Do NOT use `zafClient.get('setting.iframeURL')` — that is not a valid ZAF path and will throw an APIUnavailable erro
When support teams work in Zendesk and engineering teams work in Jira, the integration between both platforms becomes critical to ensure the success of service delivery. A customer issue reported in Zendesk often needs an engineering investigation of Jira team. Status updates, priorities, comments, attachments, and resolution details need to move between both systems without the need for manual data entry.The native Zendesk–Jira integration is a useful starting point. It helps teams create Jira work items from Zendesk tickets, link existing Jira issues to support tickets, view Jira details inside Zendesk, and share updates between both platforms.For simple workflows, that may be enough.But as teams scale, support and engineering collaboration usually becomes more complex. Organizations start using custom fields, Problem and Incident tickets, advanced Jira workflows, multiple projects, different priority models, and stricter reporting requirements. That is where the native integration c
Problem StatementThe Print Ticket History app provides bulk ticket export and print functionality directly within Zendesk Support. It allows agents and admins to search for tickets by user criteria, select individual or multiple tickets, and export them as a PDF, with an option to hide internal notes from the printed output. Location: nav bar. PromptCreate a `nav_bar` app called "Print Ticket History" that lets agents search Zendesk Support tickets by requester (name or email), select a batch with checkboxes, and download those tickets as PDFs (a single PDF for one ticket, a ZIP archive for multiple). Match the exact behaviours, layout, and PDF format described below — earlier builds got several details wrong, so the wording here is deliberately strict. **App settings**1. Add exactly one install-time parameter in `manifest.json`: ```json { "name": "hide_internal_comments", "type": "checkbox", "default": false, "required": false } ``` The `type` MUST be `checkb
Already have an account? Login
No account yet? Create an account
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.