Use Zeplin alongside Retool by extracting design tokens, component specs, and style guides from Zeplin to inform your Retool app's visual layout and branding. For programmatic access, connect Zeplin's REST API via a Retool REST API Resource to pull screen data, annotations, and design assets directly into dashboards. Setup takes 15–20 minutes.
| Fact | Value |
|---|---|
| Tool | Zeplin |
| Category | Design |
| Method | Design-to-Code Bridge |
| Difficulty | Beginner |
| Time required | 15 minutes |
| Last updated | April 2026 |
Why Use Zeplin with Retool?
Retool's visual builder gives developers fine-grained control over layout, colors, fonts, and component configuration — but without a shared reference, internal apps quickly diverge from the design system your product and brand teams have defined. Zeplin solves this by acting as the single source of truth for design specs: designers publish annotated screens and style guides from Sketch, Figma, or Adobe XD, and Retool builders reference those specs to ensure that table headers, button colors, form labels, and spacing match established standards.
The integration works in two modes. The first and most common is manual reference: Retool builders open Zeplin to inspect CSS values, color hex codes, and spacing measurements, then apply those values directly in Retool's component Inspector panel. Zeplin's CSS export feature generates values that map directly to Retool's style inputs — for example, a Zeplin color token like #1A73E8 goes directly into a Button component's custom color field. The second mode is programmatic: Zeplin's REST API lets you pull project and screen data into Retool itself, enabling teams to build design asset dashboards, track screen implementation status, or monitor which Zeplin components have been translated into Retool equivalents.
For organizations managing multiple internal tools across several product lines, connecting Zeplin's API via a Retool REST API Resource creates a live design inventory — Retool can list all Zeplin projects, display screen thumbnails, and let design leads mark implementation status directly in a Retool panel. This turns design handoff from a one-time file transfer into a continuous, queryable process with full audit history.
Integration method
Zeplin sits between your design tool and Retool: designers publish screens and style guides to Zeplin, and developers reference those specs when building Retool app layouts, choosing colors, and sizing components. For teams needing automation, Zeplin exposes a REST API that Retool can query via a REST API Resource to fetch project data, screen lists, and asset metadata programmatically — enabling design compliance dashboards or asset inventory panels.
Prerequisites
- A Zeplin account with access to at least one project (Free, Starter, or paid plan)
- A Retool account (Cloud or self-hosted) with permission to add Resources
- A Zeplin Personal Access Token generated from Zeplin's Profile → Developer section
- Basic familiarity with Retool's app builder — query editor and component panel
- Your design files already published to Zeplin from Sketch, Figma, or Adobe XD
Step-by-step guide
Export your Zeplin style guide and inspect design tokens
Before connecting Zeplin's API, start with the manual reference workflow that most Retool builders use day-to-day. Open your Zeplin project in the browser (app.zeplin.io) and navigate to the Styleguide section by clicking the Styleguide tab in the left sidebar. Here you will find all the design tokens your designers have defined: Colors, Text Styles, Spacing Tokens, and Component Library entries. Click on any color swatch to see the hex code, RGB values, and the token name (e.g., 'Primary Blue — #1A73E8'). Zeplin displays the CSS-ready value underneath each token. To export the full style guide for offline reference, click the export icon (top-right of the Styleguide panel) and choose CSS or JSON export format depending on your preference. When you are building a Retool app and need to apply a specific color, open the component's Inspector panel in Retool's right sidebar, navigate to the Style section, and paste the hex code from Zeplin directly into the color input field. For typography, Zeplin's text styles show font family, weight, size, and line height — all of which map to Retool's custom text style options in the component Inspector. Going through this process once for your primary design system creates a reference sheet your whole team can use, reducing time spent context-switching between Zeplin and Retool during builds.
Pro tip: Ask your designer to export the Zeplin style guide as JSON and paste the color and typography tokens into a Retool Database table — then all Retool builders can query that table programmatically instead of manually copying values from Zeplin.
Expected result: You have a reference of hex codes, font stacks, and spacing values from Zeplin ready to apply in Retool component Inspector panels, with consistent naming between the design system and your Retool app configurations.
Generate a Zeplin Personal Access Token
To access Zeplin's REST API programmatically from Retool, you need a Personal Access Token from your Zeplin account. Open Zeplin in your browser and click your profile avatar in the top-right corner, then select Profile & Settings from the dropdown menu. In the Settings page, scroll down to the Developer section or click the Developer tab in the left navigation. In the Developer section, find the Personal Access Tokens panel and click Generate New Token. Zeplin will prompt you to give the token a descriptive name — use something like 'Retool Integration' so you can identify it later. Click Generate. Zeplin displays the token value only once on screen, so copy it immediately and store it in a secure location such as a password manager or your team's secrets vault. Important: the token grants read access to all Zeplin projects that your account can access. If you need to restrict access to specific projects, consider creating a dedicated Zeplin account with only the relevant projects shared, and generate the token from that account. This follows the principle of least privilege and prevents a Retool query from accidentally exposing specs for unrelated or confidential projects. The token does not expire automatically but can be revoked at any time from the same Developer settings page — revocation takes effect immediately for all resources using that token.
Pro tip: Store the Zeplin PAT in Retool Configuration Variables (Settings → Configuration Variables) marked as a secret, then reference it in your resource as {{ environment.variables.ZEPLIN_PAT }}. This keeps the token out of query configurations and allows rotation without editing every query.
Expected result: You have a Zeplin Personal Access Token copied and stored securely, ready to configure as a Retool REST API Resource credential. The token appears in Zeplin's Developer settings with the name you gave it.
Add Zeplin as a REST API Resource in Retool
With your Personal Access Token ready, navigate to the Retool Resources tab — click Resources in the top navigation bar of your Retool home page, or find it in the left sidebar depending on your Retool version. Click the blue Add Resource button in the top-right corner of the Resources list. In the resource type selector, scroll through the categories or use the search bar. Since Zeplin does not have a dedicated native connector in Retool's catalog, select REST API from the API section. The REST API resource configuration panel opens. Fill in the resource settings: - Name: enter 'Zeplin API' or 'Zeplin' for easy identification - Base URL: enter https://api.zeplin.io/v1 — this is Zeplin's current stable API base URL - Authentication: in the Headers section, click Add Header. Set the key to Authorization and the value to Bearer {{ environment.variables.ZEPLIN_PAT }} if you stored it as a configuration variable, or paste the token directly as Bearer YOUR_TOKEN_HERE (less recommended for production) Leave the other settings at defaults. In the Test Connection section, you can optionally enter a test path such as /users/me to verify authentication — a successful response returns your Zeplin user profile JSON. Click Save Changes to store the resource. Once saved, the Zeplin API resource appears in your Resources list. All queries using this resource will proxy through Retool's server-side backend, meaning your Personal Access Token is never exposed in the browser network tab — Retool handles the Authorization header injection server-side on every request.
Pro tip: Create the Zeplin PAT as a Retool Configuration Variable first (Settings → Configuration Variables → Add Variable, mark as Secret) before creating the resource. Then reference it as {{ environment.variables.ZEPLIN_PAT }} in the Authorization header value — this way the token is managed centrally and never hardcoded in resource configs.
Expected result: A 'Zeplin API' resource appears in your Retool Resources list. Queries using this resource authenticate with your Personal Access Token via Bearer auth, and all requests route through Retool's server-side proxy.
Create queries to fetch Zeplin projects and screens
Open or create a Retool app where you want to display Zeplin data. In the bottom Code panel, click the + New button to create a new query. Select your 'Zeplin API' resource from the Resource dropdown. The query configuration panel switches to the REST API format with fields for HTTP method, path, URL parameters, headers, and body. For your first query — fetching all projects — configure: - Method: GET - Path: /projects - URL Parameters: add 'limit' with value 100 to retrieve up to 100 projects in one call Click Run to execute the query. Zeplin returns a JSON array of project objects, each containing fields like id, name, description, created (timestamp), updated, platform (ios, android, web, osx), and thumbnail. The raw response appears in the query output panel at the bottom. Create a second query to fetch screens for a specific project: - Method: GET - Path: /projects/{{ projectsQuery.data[0].id || textInput1.value }}/screens - URL Parameters: add 'limit' with value 100 and 'offset' with value 0 for pagination This query uses the {{ }} dynamic syntax to reference either the first project ID from your projects query or a project ID entered by the user in a text input component. Drag a Table component from the Component panel onto the canvas and set its Data Source to {{ screensQuery.data }} to display the fetched screens with all their properties. Set the query Trigger mode to On page load or wire it to a Select component that lets users choose which project to inspect.
1// JavaScript transformer to reshape Zeplin screens data for a Table component2// Add as a query transformer on the screensQuery3const screens = data;4return screens.map(screen => ({5 id: screen.id,6 name: screen.name,7 status: screen.status || 'active',8 updated: new Date(screen.updated * 1000).toLocaleDateString(),9 tags: (screen.tags || []).join(', '),10 zeplin_link: `https://app.zeplin.io/project/${screen.project_id}/screen/${screen.id}`11}));Pro tip: Zeplin timestamps are Unix epoch seconds (not milliseconds). Multiply by 1000 before passing to JavaScript's Date constructor, as shown in the transformer above, to get correct human-readable dates.
Expected result: Two queries are configured — one returning a list of Zeplin projects and one returning screens for a selected project. A Table component on the canvas displays the screen list with names, statuses, update dates, and direct Zeplin deep links.
Build a design handoff tracking panel
With Zeplin project and screen data flowing into Retool, build a practical handoff tracker that design and engineering teams can use together. This combines the Zeplin REST API data with a Retool Database table for tracking implementation status — a piece of state that Zeplin itself does not manage. First, create a Retool Database table to store tracking data. In the Retool home page, navigate to Database in the left sidebar (the table icon). Click Create new table and name it 'design_handoff'. Add columns: screen_id (Text), project_id (Text), status (Text — values: Not Started, In Progress, Built, Needs Review), notes (Text), assigned_to (Text), updated_at (Timestamp). Back in your Retool app, add a third query targeting Retool Database to read the handoff tracking data: - Resource: Retool Database - Query: SELECT * FROM design_handoff WHERE project_id = {{ projectSelect.value }} In the app canvas, arrange the layout: a Select component at the top lets users pick a Zeplin project (data from projectsQuery), a Table component in the main area shows screens from screensQuery joined with handoff status from the Retool Database query using a JavaScript transformer, and a Form component in a side panel (Container → Form) lets users update the status and notes for a selected screen row. Wire the Form's Submit button to an INSERT or UPDATE query on Retool Database that saves the implementation status. Add a success event handler that triggers the handoff query to refresh the table. For teams working at scale, add a Retool Workflow to send a Slack notification whenever a screen status changes to 'Built' — completing the loop between design and engineering. For complex multi-project tracking across many teams, RapidDev's team can help architect the full Retool solution with proper permission scoping and Workflow automation.
1// JavaScript transformer to join Zeplin screens with Retool Database tracking data2// Run after both screensQuery and handoffQuery complete3const screens = screensQuery.data || [];4const tracking = handoffQuery.data || [];5const trackingMap = {};6tracking.forEach(row => { trackingMap[row.screen_id] = row; });78return screens.map(screen => ({9 screen_id: screen.id,10 name: screen.name,11 updated: new Date(screen.updated * 1000).toLocaleDateString(),12 status: trackingMap[screen.id]?.status || 'Not Started',13 assigned_to: trackingMap[screen.id]?.assigned_to || 'Unassigned',14 notes: trackingMap[screen.id]?.notes || '',15 zeplin_link: `https://app.zeplin.io/project/${screen.project_id}/screen/${screen.id}`16}));Pro tip: Use Retool's Table component 'Column settings' to make the zeplin_link column render as a hyperlink with display text 'Open in Zeplin' — set the column type to 'Link' and the href value to {{ currentRow.zeplin_link }}.
Expected result: A complete design handoff panel shows all Zeplin screens for the selected project with their implementation status, assigned developer, and notes. Design leads can track which screens are built and which are still pending without leaving Retool.
Common use cases
Build a design spec reference panel for Retool builders
Create a Retool app that pulls all active Zeplin projects and their screens via the Zeplin REST API, displaying screen names, last-updated timestamps, and direct Zeplin links. Retool builders working on new apps can look up the matching Zeplin screen spec without leaving the Retool environment. Filter by project, designer, or component type to quickly locate relevant specs.
Build a Retool panel that lists all Zeplin projects from the API, shows each project's screens with thumbnail previews and Zeplin deep links, and lets developers mark each screen as 'In Progress', 'Built', or 'Needs Review' in a tracking table stored in Retool Database.
Copy this prompt to try it in Retool
Design token consistency audit dashboard
Build a Retool dashboard that pulls Zeplin's style guide colors, text styles, and spacing values via the API and compares them against a manually maintained list of approved design tokens. Highlight any tokens that appear in Zeplin but have not yet been applied in Retool app configurations, giving design leads visibility into implementation gaps.
Create a Retool design audit panel that fetches color styles and text styles from the Zeplin API for a specified project, displays them in a table with hex values and font details, and includes a 'Verified in Retool' checkbox column that saves state to Retool Database for tracking.
Copy this prompt to try it in Retool
Zeplin project activity dashboard for design operations
Build a Retool operations dashboard for design managers that shows recent Zeplin project activity: which screens were updated in the last 7 days, which projects have unresolved annotations, and which screens are marked as final vs. in-progress. Use Retool Charts to visualize update frequency over time across projects.
Build a Retool dashboard that queries the Zeplin API for project screens updated in the past week, groups them by project in a Table component, shows each screen's status and last editor, and includes a bar chart of update activity by day using Chart component.
Copy this prompt to try it in Retool
Troubleshooting
Zeplin API query returns 401 Unauthorized even though the token was just generated
Cause: The Authorization header is malformed — most commonly the word 'Bearer' is missing or there is an extra space, or the token was accidentally truncated when copying from Zeplin's settings page.
Solution: In your Retool Resource settings (Resources tab → click Zeplin API → Edit), verify the Authorization header value is exactly 'Bearer YOUR_TOKEN' with a single space between Bearer and the token, and no trailing whitespace. Copy the token from Zeplin again (go to Profile → Settings → Developer → Personal Access Tokens) and paste it fresh. If using a configuration variable, verify the variable value in Settings → Configuration Variables does not have leading/trailing whitespace.
Screens query returns an empty array even though the project has screens in Zeplin
Cause: The project_id parameter in the path is incorrect — either undefined because the projects query has not run yet, or referencing a field name that does not match the Zeplin API response structure.
Solution: Click on your projectsQuery in the Code panel and inspect the raw output in the Response tab. Find the exact field name Zeplin uses for the project identifier — it should be 'id'. Update your screens query path to reference the correct field: /projects/{{ projectsQuery.data[0].id }}/screens. If the projects query runs asynchronously and has not resolved when the screens query runs, set the screens query Trigger mode to Manual and wire it to the projects query's On success event handler to ensure correct sequencing.
Zeplin API returns 403 Forbidden for specific project endpoints
Cause: The Zeplin account that generated the Personal Access Token does not have access to that specific project — Zeplin projects must be explicitly shared with a user for their token to access it.
Solution: In Zeplin, open the project that is returning 403, click the Members tab in the project settings, and verify that the account associated with your Personal Access Token is listed as a member. If not, invite that account to the project with at least Viewer permissions. After the invitation is accepted, the token will have access and the Retool query will return data correctly.
The screens transformer shows incorrect dates — timestamps show years in 1970 or far future
Cause: Zeplin's API returns timestamps as Unix epoch seconds, not milliseconds. JavaScript's Date constructor expects milliseconds, so passing the raw value directly produces wildly incorrect dates.
Solution: In your transformer function, multiply the timestamp by 1000 before passing to the Date constructor: new Date(screen.updated * 1000).toLocaleDateString(). This converts seconds to milliseconds and produces correct human-readable dates. Apply the same fix to any other timestamp fields such as 'created'.
1// Correct date conversion in transformer2const date = new Date(screen.updated * 1000).toLocaleDateString();Best practices
- Store your Zeplin Personal Access Token in Retool Configuration Variables marked as Secret (Settings → Configuration Variables) rather than hardcoding it in resource or query configurations — this enables rotation without editing queries.
- Use Zeplin's project ID (not project name) as the key identifier in Retool queries and tracking tables — project names can change, but IDs are permanent and consistent across the API.
- Create a dedicated Zeplin service account with access only to the projects relevant to your Retool integration, then generate the PAT from that account — this follows the principle of least privilege and limits exposure if the token is compromised.
- Add a 'limit' parameter to all Zeplin list endpoints (set to 100 or your expected max) — the API defaults to returning a small page size, so without explicit limits you may see incomplete data in your Retool tables.
- For high-traffic dashboards polling Zeplin's API frequently, enable query caching in Retool (Advanced tab of the query → Cache duration in seconds) — design assets rarely change within minutes, so a 300-second cache reduces API calls and improves app responsiveness.
- Keep the manual spec-reference workflow as the primary handoff method and use the API integration for reporting and tracking only — designers will always keep Zeplin more current than any API-driven Retool panel.
- Document which Zeplin style guide tokens map to which Retool component settings in a shared Retool Database table so all builders on your team apply tokens consistently without rechecking Zeplin for every component.
Alternatives
Choose Figma if your design team uses Figma as their primary design tool — Figma's Dev Mode provides similar spec inspection features built into the design environment without a separate handoff tool.
Choose Adobe XD if your designers work in the Adobe Creative Cloud ecosystem — XD has its own design specs and handoff features that can be used directly without Zeplin as an intermediary.
Choose Miro if your team needs collaborative whiteboarding and flow diagramming rather than pixel-level design specs — Miro's REST API similarly lets you pull board content into Retool dashboards.
Frequently asked questions
Does Zeplin have a native connector in Retool, or does it require a REST API Resource?
Zeplin does not have a dedicated native connector in Retool's Resources catalog. You connect to Zeplin by creating a generic REST API Resource with Zeplin's base URL (https://api.zeplin.io/v1) and a Personal Access Token in the Authorization header. This gives you full access to Zeplin's API — the only difference from a native connector is that you specify endpoint paths manually rather than selecting actions from a dropdown.
What can I do with Zeplin's API in Retool versus just referencing Zeplin manually?
The manual reference workflow — opening Zeplin to inspect CSS values and copying hex codes into Retool's Inspector — covers most day-to-day use. The API adds value when you need to build tooling on top of Zeplin: listing all screens across projects, tracking implementation status in a database, monitoring which screens were recently updated, or generating reports on design handoff progress. If your team has one Retool builder occasionally referencing Zeplin, manual inspection is sufficient. If multiple builders across multiple projects need coordination, the API integration pays off.
Can Retool write data back to Zeplin via the API, such as adding annotations or updating screen status?
Zeplin's API is primarily read-oriented for design data — you can read projects, screens, components, and style guides. Write operations such as adding annotations or updating screen statuses are limited in the public API compared to what the Zeplin UI supports. Check Zeplin's official API documentation at docs.zeplin.dev for the current list of supported write endpoints. Most teams use Zeplin as the read source and track implementation status in a separate Retool Database table that they control.
How do I handle Zeplin API pagination in Retool queries for projects with many screens?
Zeplin's list endpoints support 'limit' and 'offset' URL parameters for pagination. In your Retool query, add URL Parameter 'limit' set to 100 (the maximum per page) and 'offset' set to {{ (pagination.page - 1) * 100 }} to paginate through results. For most internal design projects with fewer than 100 screens per project, a single request with limit=100 is sufficient. For very large projects, use a JavaScript query to make sequential API calls and concatenate the results.
Is it safe to use a Zeplin Personal Access Token in Retool?
Yes, when configured correctly. Store the token in Retool Configuration Variables marked as Secret (Settings → Configuration Variables) and reference it in your REST API Resource header as {{ environment.variables.ZEPLIN_PAT }}. Secret configuration variables are never exposed to the browser frontend — they are injected server-side by Retool's backend on each request. Avoid hardcoding the token directly in query configurations, as those values may be more visible in app exports or logs.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation