Zaps can have one or more actions.
There are two types of actions to select.
## 1. Create actions
Most Zapier integrations should at a minimum include create actions to let users add items to their app automatically. Common actions by app category [here](/platform/quickstart/must-have-triggers-and-actions) should be used for inspiration when building your app.
*Create* actions in Zaps can create new items in an app or update existing items. The output returned should be an object containing individual fields that will be parsed for mapping into subsequent Zap steps.
The [output returned](/platform/build/response-types) by a *create* should be an object containing individual fields about the item that was created such as IDs, details about the new item including a link if possible, and any other useful data about the record. Do not return just a `success` message.
Unsucessful actions should return `4xx` errors. If your API returns a `2xx` error, add custom code to your API call to replace it with a correct error.
Update actions should be separate from create actions.
Actions may create multiple items if needed, using the same data, though you will likely need to customize the API call code to create multiple items at once. Only do this for linked items, such as if an app stores customers and customer addresses separately. If the multiple items that need to be created are top-level, complex items in your app, they should be separate actions within Zapier. You can then link the two with a drop-down menu in the action to select the paired item, add a search action for users to find the specific item they need, and then let them match the items with the [*Use a Custom Value* option](https://help.zapier.com/hc/en-us/articles/8496241696141) in Zapier.
## 2. Search actions
*Search* actions find existing items in an app and can optionally be paired with *create* actions to [add a new item](/platform/build/search-or-create) if the search does not return a result.
Search actions let users do more with the data they've already added to your app; such as avoiding adding duplicate items or look up info about an item, for example weather, conversion, and contact lookup, to use in a subsequent step.
Most useful searches return one individual item that will likely be needed in another Zap step.
The [output returned](/platform/build/response-types) by a *search* should be a JSON-formatted array sorted with the best match first. Only the first item will be returned. For no match found, a `200` with an empty array must be returned. If your API returns a `404` error for searches without results, add custom code to your API call to replace it with an empty array.
## 3. Delete actions
Zapier recommends careful consideration of action steps that fully delete or remove data. To prevent data loss, action steps should only add or update data.
If you are considering adding a delete action to your app, consider alternative actions for items such as deactivating, unsubscribing, or canceling, instead of deleting items completely.
If you do add a delete action, make sure to include a `Copy` field to clarify to users that the action is irreversible once the API request is made.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/active-users.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Active users retention
> At Zapier, churn means a user used your integration in their Zaps 29 - 56 days ago, but hasn't run a successful task in one of those Zaps in the past 28 days. This user is considered to have churned from the integration. Maybe they switched to using a competing integration or their workflow had a more periodic or seasonal cadence.
But, it could also mean they got so frustrated with the experience of trying to get their Zap working and *keep* it working successfully - they turned it off, deleted it, and walked away.
Active users are the percentage of users who haven't churned.
## Key Zapier insights
Lowered active user retention rates don't necessarily mean poor integration health. Some apps lend themselves to use-cases with shorter lifespans than others. That said, spikes in churn rate not related to seasonal variations in usage could be indicators of a problem with something not functioning as expected.
Active user retention is not a leading indicator. In fact, it's quite a lagging one that may only start indicating a problem up to 28 days after it has been an issue. That doesn't deem it useless, we just have to know how to make full use of it.
## Best practices
Approaching active user retention with a long-term strategy can help maintain a consistently high level of retention:
* [Embed](https://platform.zapier.com/embed/overview) the Zapier experience with copy-and-paste and customizable code within your platform to provide automation value directly to users. Embeds have proven to [reduce churn](https://platform.zapier.com/partner_success_stories/all) on Partners' platforms. Learn about embedding options in the [guide](https://learn.zapier.com/surface-your-zapier-integration-within-your-app).
* [Share use cases](/platform/publish/partner-faq#tip-4-share-zapier-use-cases-in-your-onboarding) widely during your platform's onboarding process. Having multiple Zaps using your integration increases stickiness of users not only to the Zapier integration, but also to your platform.
* Update the integration regularly with features as your platform evolves. [Invite stakeholders to your integration](/platform/manage/add-team) to give them admin or read-only access to insights, metrics, and feedback to prioritize and align improvements.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/add-fields.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add input fields to triggers and actions
> When building in the Platform UI, you'll use the Input Designer to create the form users will input data into, to send to your app's API.
The Input Designer works similarly to other form builder tools, building a form that lives inside the Platform UI. Add fields to your form for each bit of data your app needs from users. Use the same name for items as used in your app's UI. Configure each field's settings, then reorder them to match the logical order users would add or view data in your app.
{" "}
{" "}
Actions require an input form, as they always need a way for users to send data to your app's API to find, update, or create a new object. An input form is optional for triggers.
In this guide we will cover:
* Add an input field to a trigger or action
* Set field options
* Reorder input fields
* Remove input fields
## Add an input field to a trigger or action
1. Log into the [Platform UI](https://zapier.com/app/developer).
2. Select your **integration**.
3. In the *Build* section in the left sidebar, click on your **trigger** or **action**.
4. Click the **Input Designer** tab.
5. For triggers, click **Add User Input Field**. For actions, click **Add** and select **Input Field**.
6. In the Form editor, add in details about your input field:
* **Key**: A unique identifier for the field, without spaces, ideally with the same key as your API, such as `first_name`.
* **Label**: A user friendly name for the field, such as `First Name`.
* **Help Text**: (optional) A 20 character or longer description that appears under the field label, with [Markdown](https://zapier.com/blog/beginner-ultimate-guide-markdown/) formatting. Do not include redundant help text in input fields that repeats the name of the field. Use field help text to tell users what to do, for example “Choose the directory to watch for new files”. Always use active voice.
* **Type**: From the dropdown menu, select type of data you want user's to enter. Learn more in [field definitions and types](/platform/build/field-definitions):
* String
* Text
* Integer
* Number
* Boolean
* DateTime
* Password
* Dictionary
* **Default Text**: (optional) Value to include in the field if the user leaves it blank; only include if this value would work for API requests made to every user's account.
* **Options** (optional):
* Select the **Required** checkbox to make it mandatory for users to add data into this input field.
* Select **Allows Multiples** checkbox if you want users to add multiple enteries into the same input field.
* Select **Alters Dynamic Fields** to have Zapier automatically recompute any dynamic fields any time this field is changed.
* Select **Dropdown** 7. Once you've finished adding details for your input field, click **Save**.
## Setting field options
### Required
An email app like MailChimp requires an email address to add a new email subscription, and a calendar app like Google Calendar requires an event title, date, and time to add new events.
Check the *Required* option on those fields if your trigger or action step requires any data to make the API request. Zapier will show a red `(required)` label beside the field name in the Zap editor, and will not let users complete the Zap step without adding data to that field.
{" "}
{" "}
Include a description on required fields to let users know exactly what type of data they should add to this field. Never mark fields as required if the integration could work without them.
### Allows multiples
If users could add multiple entries in the same field, check the *Allows Multiples* option.
{" "}
{" "}
That will add another entry row to allow the user to input another entry for that field. An [array containing a comma separated list of entries](/images/95938b473edfee13663161ee3c8e5ea4.webp) is sent in the API request. Never ask users to type in a comma separated list, rather use this functionality.
### Alters dynamic fields
For each [dynamic field](/platform/build/dynamic-field) in your integration, Zapier runs code to decide whether to show a field or what to show in a field.
Check the *Alters Dynamic Fields* option, to have Zapier automatically recompute any dynamic fields in your Zapier integration anytime this field is changed. Do not check the *Alters Dynamic Fields* option unless the field is needed for your integrations' dynamic fields.
{" "}
{" "}
Only dropdowns support *Alters Dynamic Fields*.
### Dropdown
#### Static Dropdown
To offer users pre-set options to choose from in a field, set your field type as `String`, then check the *Dropdown* option.
{" "}
{" "}
You'll see the default *Static* selected, or *Dynamic*. To add a Static menu of choices, type the options in a comma separated list, with quotes around each item and square brackets around the set, such as:
`["one", "two","three"]`
Enter the fields as used in your API, as Zapier will pass the exact value users select to your app. Zapier will capitalize each item in your dropdown menu in the Zap Editor, and will add spaces instead of any underscores, so an option like `first_name` would show in the menu as `First Name` to users.
**Static Dropdown with Key Value Pairs**
If your API requires different values for the field than the text you want to show to users inside the dropdown menu in Zapier, make a key value pair that includes the value to send to your API, the sample value to show users ([should be the same as the value](https://github.com/zapier/zapier-platform/blob/master/packages/schema/docs/build/schema.md#fieldchoicewithlabelschema)), and a user-friendly label.
{" "}
{" "}
To do that, add each menu item inside an object (curly brackets); with the sample, value, and label comma separated. List the item first and the value second, both wrapped in quotes. Separate each menu item with commas, and wrap the whole set in an array (square brackets).
For example, if your API expects a value of `1` or `2`, but `1` actually means `pork` and `2` actually means `fish` to a user, you could use the following code to add the dropdown menu pictured:
```JSON theme={null}
[
{
"sample": "1",
"value": "1",
"label": "Pork"
},
{
"sample": "2",
"value": "2",
"label": "Fish"
}
]
```
Alternatively, you can also use the syntax of `value:label`, which shows to users as follows:
{" "}
{" "}
{" "}
{" "}
#### Dynamic Dropdown
If users need to select data from their account in your app — such as a project, folder, team member, or other user-specific detail with a corresponding ID — then you would use a dynamic dropdown. For dynamic dropdowns, Zapier first fetches data from your API and then displays it in a menu. Never make users type in an ID number, rather use this functionality or [add a search action](/platform/build/search) to find the ID number automatically.
The best way to make a dynamic dropdown is to use a dedicated trigger to fetch the values for the menu.
**1. Build a trigger to fetch dynamic dropdown data**
Create a new trigger, with a key, name, and noun. This trigger is usually configured to not be seen by users but you may wish to include a description for your internal team's awareness. In the *Visibility in Editor* field, select `Hidden` to hide this trigger from your app's trigger list in Zapier.
{" "}
{" "}
You can also use an existing, visible trigger to power a dynamic dropdown if applicable.
Skip the *Input Designer* tab, as the dynamic dropdown cannot require any user input.
Select the *API Configuration* tab, and add the API call where Zapier can fetch the data from your API. For standard Zapier triggers, you would use an API call that fetches new or updated items. For dynamic dropdowns, instead use an API call that pulls in a list of the items that the user can select from.
{" "}
{" "}
API calls will usually require additional configuration to pull in data in the order that makes most sense in your menu. You may want to sort options in the order they were added or updated, or want to have the API fetch more items at once than the default. Set these parameters from the *Show Options* menu.
{" "}
{" "}
If your API supports pagination, you can allow users to load additional data in
the menu by checking the *Support Paging* box. The first API call might pull in
20 items; if the user requests additional items, Zapier would call the API again
and request the second page for the next 20 items. *per\_page* and *limit* are
common parameters to indicate how many items to pull (controlling the page
size). Confirm which parameter to use from your API's documentation.
Customize the pagination using [Code Mode](/platform/build/code-mode). Learn more about [how to use pagination in triggers](/platform/build/trigger#how-to-use-pagination).
Zapier shows the data in the dropdown menu in the order your API sends it to Zapier. If your API sends the data in alphabetical order, or numerical order, it will show as such in your drop-down menu. If your API call supports sorting, include the sorting parameter in your API call that would return data in the order you want it to show in your drop-down.
Define the fields from this hidden trigger that you need to use in the dynamic dropdown input field. To do so, test your trigger and identify the output fields needed, adding them to the *Output Fields* list at the end of your settings page. Include at least a field with the data that Zapier needs to send to your API in the action (for example `id`), along with a field that includes a user-friendly `name` for the data in that field.
{" "}
{" "}
**2. Add an input field with dynamic fields**
To use the data from the hidden trigger you've configured, add a new input field to the trigger/action you're working on, and set the label, key, and other details as normal. Check the *Dropdown* box and select the *Dynamic* toggle. Choose the hidden trigger you've configured for this menu in the *Dropdown Source* option.
{" "}
{" "}
Select the field with the data your API needs for this action in the *Field Name* menu, and the field with a human-friendly name for the data in the *Field Label* menu. The [preview will indicate the presence of the field](/images/4780bb34f2f3d24062d2eb556ed1e3a9.webp), but you will need to use your trigger/action in a Zap to test the menu and pull in real data.
When this trigger/action is selected in a Zap, the user will see a dropdown as Zapier polls your API for the data from that hidden trigger, parse the entries and extract the fields you specified, showing them in a user-friendly dropdown menu. The human-friendly name will be in larger, darker text, and the value to be sent to the API in smaller, lighter text.
{" "}
{" "}
It is important to provide the API value (example `id`) for users to know what type of data the field expects. Users can also choose to [enter a custom value](/images/f72a12759a3b3b391025f6500f6c7904.webp)
and map data from other Zap steps into this field. Being able to see what type of value to map is extremely helpful.
**3. Add search to a dynamic field (optional)**
Dynamic Dropdown menus can optionally include an additional *Add a Search Step* button beside the dropdown menu. This lets users dynamically select the correct item from a dynamic field based on input from previous Zap steps.
{" "}
{" "}
You'll need to add a [Search Action](/platform/build/action#how-to-add-a-search-action) to find the items used in this dropdown menu. Then check the *Add a search to this field* option under the dynamic dropdown you've built, choose that action, and enter the ID of the field from that trigger that Zapier needs to pass with this API call (which should include the same data as the *Field Name* you selected before for the dynamic menu).
{" "}
{" "}
When users click or add a search step in their Zap, Zapier will add a new search step before this action step.
This allows the user to enter the details to search for the item they need, and Zapier will automatically map the correct output value from that search to this dynamic dropdown field [as a custom value](https://help.zapier.com/hc/en-us/articles/8496241696141-Add-custom-values-to-dropdown-menu-fields-in-Zaps#01H7FR09FBWT481ZJ77VVR0HBR).
We have a video tutorial on Dynamic Dropdowns which you can view here:
## Reorder input fields
Reordering input fields in triggers or actions can help improve readability and usability.
List the most important, required fields first, with less important, optional fields near the bottom. Have related fields (such as first and last name) near each other. Ordering fields in Zapier similar to the order of fields in any input forms in your app will increase ease of use.
{" "}
{" "}
In your trigger or action settings:
1. Click the **Input Designer** tab.
2. In the *Sort* column, click the **up**
{" "}
{" "}
or **down**
{" "}
{" "}
arrow to move the fields to the order you want in the Form Editor screen.
3. The preview on the right shows how the finished form looks to users inside Zapier.
4. A pop-up message will appear to confirm your changes have been saved.
## Remove input fields
Make sure to delete only unnecessary fields, as a previous version of the input form cannot be restored. You cannot remove input fields from public integrations; you must [create a new version of your integration](/platform/manage/versions) before changing input fields and [consider the impacts of the change](/platform/manage/planning-changes#changing-form-field-keys).
In your trigger or action settings:
1. Click the **Input Designer** tab.
2. Click the **gear icon**
beside the input field you want to delete.
3. Click **Delete**.
4. Click **Confirm** to remove the input field from your integration.
5. A pop-up message will appear to confirm your changes have been saved.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/publish/add-or-modify-branding.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add or modify integration branding and details
> When creating a new integration in the Platform UI from the link `https://developer.zapier.com/app/new`, you'll be prompted to add the app name, description, homepage URL and logo.
## Platform UI
It is also required to complete the Intended Audience, your role and the app's category.
## Platform CLI
When creating a new integration in the Platform CLI, you can optionally add the app name, description, and homepage URL to the `package.json` file. The rest of your app's branding needs to be added in the Platform UI once you `zapier-platform push` (or deprecated `zapier push`) your integration for the first time.
Build your integration locally first. Once you've added your app's core details, authentication, triggers, and actions, push your integration to Zapier with a `zapier-platform push` (or deprecated `zapier push`) command. Zapier will use the name you added in the CLI integration settings, along with a placeholder icon for your app.
Next, add your app's branding via the Platform UI at [developer.zapier.com/](https://developer.zapier.com/). There you will see every Zapier integration you've built. The *My integrations* section includes every app you've added via Zapier's Platform UI or CLI. Look for the integration you built with Zapier CLI and select.
Only the branding for your CLI-built app can be edited in the UI; authentication, triggers, and actions must be edited in your local environment and pushed to Zapier.
To edit branding, select the gear icon in the upper left hand corner near your app's name and placeholder icon. Edit your integration's name and description, and upload your app's logo (a square, transparent PNG at least 256x256px), meeting [requirements](/platform/publish/branding-guidelines). Below that, set your app's Intended Audience, your role and the app's category. Select *Save*.
## Modify or rebrand your integration
### Private integrations
For integrations in `private` status, branding can be updated anytime on the Integration Settings page. Access Integration Settings by clicking the gear icon to the right of the integration name.
### Public/Beta integrations
For integrations in `public` or `beta` status, branding changes need to be processed by our Partner Support team. To request branding changes, visit the Integration Settings page and click the form linked at the top of the page.
The app ID and your Zapier account email will automatically populate into the form. Provide only the details you want updated on your integration's directory page, and submit the form. You'll receive a confirmation email of your submission, and the Partner Support team will process the changes within 1 business day. You'll receive a second email confirming once the changes have been made.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/add-team.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Invite team members to your integration
> Integrations do not have a dedicated owner, instead they are managed by a team that can be modified as needed. Add team members to your integration to collaborate, contribute, and view analytics data for your integration on the Developer Platform. Your integration team can have up to 200 team members, regardless of whether your integration is Private or Public.
Team members added to your integration will be assigned one of the following roles:
* **Admin**: Admins are granted read and write access to the integration. This role is ideal for developers and individuals actively involved in building and maintaining the integration.
* **Collaborator**: Collaborators are granted read-only access to the integration. Collaborator access is recommended for product, leadership, partnership, marketing, and other teams seeking access to integration data for analysis and record-keeping without direct involvement in its creation and maintenance. While they cannot make direct changes to the integration, they can:
* View performance data
* View the integration history
* Review and comment on feature requests and bug reports
* Access tools to embed your integration throughout your site to drive user adoption
## Invite team members
To add team members to your integration, follow these steps:
1. Log into the [Developer Platform](https://zapier.com/app/developer)
2. Choose your integration
3. In the *Manage* section on the left sidebar, select *Manage Team*
4. Select *Invite Team Member*
5. Enter the email address of the team member that you want to invite
6. Select the role that you wish to assign to the team member
7. A note will be included in the invitation email. You can either use the default message provided, or customize it with your own text
8. Click *Send Invite*.
### Notes
* Each integration team can have only one designated marketing contact and one designated technical contact at a time
* A single user can be labelled as both the technical and marketing contact, they do not need to be separate users
* Users are not alerted when they are assigned or removed from a role
* Only Admins can assign roles, Collaborators cannot assign roles
* To remove a role from a user, you will need to assign the role to another user on the integration team
* Assigning a role already assigned to a new user will cause the role to automatically be removed from the original user
* Only integration team members that have accepted an invite to join the integration team can be assigned a role (ie team members that are Invitation Pending cannot be assigned a role)
* The user assigned as the marketing contact will be shown as the contact on invite sharing pages
* A user assigned as either the marketing or technical contact cannot be removed from the integration team. To remove a user from an integration team, you will first need to assign the marketing/technical contact role to another user
## Manage email subscriptions relating to your integration
### General marketing updates
Zapier sends out general partner marketing updates related to your integrations and the Developer Platform. These emails include:
* Monthly Partner Newsletter with integration data insights
* Outreach about partnership and co-marketing opportunities
To control your subscription for these emails, visit the [email preferences page](https://developer.zapier.com/partner-settings/email) in the developer dashboard and opt in or out per each integration you are a team member of.
### Platform and Partner Program updates
All members of your integration's team will also receive Zapier Platform and Partner Program Updates. These emails include:
* Alerts about user [Bugs and Feature Requests](/platform/manage/integration-insights)
* Critical Platform and Program Updates
You cannot unsubscribe from Zapier Platform and Partner Program Updates unless an existing integration team member removes you from the integration team entirely. These emails deliver essential announcements about the Partner Program, Zapier Platform features, product updates, and compliance with integration quality standards to ensure you're always up-to-date with changes that could impact your use of the Zapier Platform.
> **Note:** Integrations built with the Zapier Platform UI can enable the *skipThrowForStatus* toggle under [Advanced/Settings](/platform/build/errors) to On to use [`skipThrowForStatus:true`](https://cdn.zappy.app/8ac6af91f6b27c4a473d566f1534b27e.png) on every request
## 3. Specify how long Zapier should wait before retrying
The `ThrottledError(message,delay)` method accepts two input parameters; a custom error message (string) and a delay expressed in seconds (integer).
Include a Retry-After header with responses provided by your API during downtime, to specify the amount of time until the service is expected to be back online and Zapier should retry the request. Your [custom error handling script](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-response-handling) can read this header and pass it to the delay parameter for `ThrottledError()`, like this:
```js theme={null}
if (response.status === 503) {
const delay = response.getHeader("retry-after");
const message = `Service is temporarily unavailable. Retrying in ${delay} seconds.`;
throw new z.errors.ThrottledError(message, delay);
}
```
## 4. Scheduled API maintenance
For periods of scheduled maintenance, a status of an app (API) as “unhealthy” can be set between a specific start and end time on request. A “Scheduled Maintenance” message will then be posted to our [status page](https://status.zapier.com) for [example](https://status.zapier.com/incidents/njgw7lrhn5hs).
The app will also have a status of “unhealthy” on the [*App Status* tab.](https://status.zapier.com/#app-status)
During a set maintenance window, Zaps impacted by the downtime will be affected as follows:
**Actions/Searches:** Zap runs with affected actions/searches will have the status of “Playing” in the Zap History page. The action/search will be delayed until the incident resolves, or up to five times. On the fifth time, Zapier will attempt it regardless of the app status. If it fails, Zap runs will error and [normal manual replay mechanisms](https://help.zapier.com/hc/en-us/articles/8496241726989-Replay-failed-Zap-runs) can be used to try to replay any affected Zap runs.
**Triggers:** *most* Zaps with affected (polling) triggers won't run and so (for the most part) there will be no Zap runs in [Zap History](https://help.zapier.com/hc/en-us/articles/8496291148685-View-and-manage-your-Zap-history).
In more detail, Zapier will “skip” 90% of polls, allowing 10% through, so typically *some* runs will occur for *some* Zaps. After 15 minutes, all polling is re-enabled to check if the API is healthy again. If not, Zapier will again “skip” 90% of polls. This will be repeated until the API is healthy. Once the API is healthy, Zaps will be triggered and “catch up” on missed data, subject to normal polling limitations such as [pagination](/platform/build/trigger#how-to-use-pagination).
If Zap runs error users will be notified via email based on their [notification settings](https://help.zapier.com/hc/en-us/articles/8496289225229-Manage-notifications-when-errors-occur-in-Zaps).
If you would like to schedule a maintenance window for your app, please send across the following information to [Developer Support](https://developer.zapier.com/contact)
* Start date and time (in UTC)
* End date and time (in UTC)
* Further details about how the API will respond during the downtime if called; eg. will it return an [HTTP 503](https://www.webfx.com/web-development/glossary/http-status-codes/what-is-a-503-status-code/) “Service Unavailable” status code or not respond at all.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/apikeyauth.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add authentication with API Key
> API Key authentication passes along a user-entered API Key with every API call. In your Zapier integration using API Key authentication, the API key—and optionally any other data your API needs—is included every time a Zap step runs.
{" "}
Use API Key authentication if your API primarily uses an API key to identify accounts, especially with apps for weather, maps, content verification, file conversion, and other data tools that require a key for access to the service but do not contain user-specific content.
Since API Key authentication allows you to create a custom input form, you can use it for any custom authentication type with username and password-based logins that don't fit other authentication scheme types.
## 1. Build input form
* Open the *Authentication* tab in Zapier visual builder and select *API key*.
{" "}
* Add authentication input fields where users will enter their API key and any other required authentication details. Check your API documentation for what fields are required, including user or account names, domains, and more. Note any details users may need on how to find that data in your app. API keys especially are often hidden under settings menus and you'll need to include those details in your input form's help text.
{" "}
* Click the *Add Fields* button and fill in the details for your field. Add the most commonly needed fields first, in the order users expect, as you cannot reorder fields once added.
* Add the required *Key*, the name your API uses to reference this field.
{" "}
* Fill in the optional fields, as appropriate, especially the *Label*:
– **Label**: A human-friendly name for this field that will be shown to users in the authentication form.
– **Required? (checkbox)**: Check if this field is required for successful authentication.
– **Type**: All input fields use the `string` text field by default; select `password` instead if you would like to obscure the data as users enter it.
– **Help Text**: Include a direct URL formatted with [Markdown](https://zapier.com/blog/beginner-ultimate-guide-markdown/) where users can obtain their API key from your app. If there is no direct link, include as clear of directions as possible to help users find the API key.
– **Input Format**: (optional) Help users figure out exactly what piece of data you need them to enter. For example, for [a subdomain](/platform/build/subdomain-validation), [https://.yourdomain.com/](https://.yourdomain.com/).
– **Default Value**: Include a value for this field to be used as a fallback. For optional fields, the default value is set on initial connection creation and used in the API call instead of missing or null values every time the Zap runs. For required fields, this value is used during connection creation, but not when the Zap runs (Zapier raises an error for missing/null values instead).
* Input fields marked as password and all authentication fields with sensitive, private data such as API keys from API Key auth are automatically censored at runtime. These values are stored in the Auth bundle and used in API calls, but are replaced in Zapier's logs with a censored value like this `:censored:6:82a3be9927:`. Due to this, it is not possible to view the exact tokens or keys in Zapier's logs. To verify that the same token as was returned by the authentication, is being used in subsequent API calls; you can compare censored value characters, for example `:censored:6:82a3be9927:` would have the same value ending in 9927 when used in a subsequent call.
* Computed fields are not applicable to API Key authentication and are only used with OAuth v2 and Session Auth.
* Each input field is listed with its label, key, type, and required status in your authentication settings. Click the field to edit it, or click the gear icon and select *Delete* to remove a field.
{" "}
* Once you've added all the input fields to your authentication form, select *Continue*
## 2. Add a Test API Request
* Add an API call to your API that requires no configuration, typically a `/user` or `/me` call. Add the URL for the API call, and set the call type, typically a `GET`. This will test the user-entered API key and any other credentials to ensure it enables a successful API call to your app.
{" "}
* The API key and any additional input fields are automatically included in the URL Params and the HTTP Headers. Click *Show Options* to remove the details where they are not needed. It is typically not recommended to pass any sensitive information such as the API key in the URL Params. Passing it through the headers or even the body is preferable.
* To customize the test API request, select *Switch to Code Mode* and write custom JavaScript code to handle your test API call and the response parsing as needed. The first time you click the toggle, Zapier will convert your API call to code. If you switch back to Form Mode though, Zapier will not convert your code changes to the Form mode, nor will any subsequent changes in the form be added to your code.
{" "}
## 3. Configure a Connection Label
Review [connection label documentation](/platform/build/connection-label) to optionally differentiate the app accounts users connect.
## 4. Test your authentication
Connect a valid user account to [test authentication](/platform/build/test-auth).
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/authentication/methods/app-access-token.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# App Access Token
> How to authenticate with an App Access Token
### Prerequisites
* Your app needs to be published as a [public integration](https://platform.zapier.com/quickstart/private-vs-public-integrations) in Zapier's App Directory.
### Retrieving and Using an App Access Token
While many API endpoints require a user access token to perform actions on behalf of a user, some (like [unenrolling a user from a promotion](https://docs.zapier.com/powered-by-zapier/api-reference/promotions/delete-enrollment)) require an App Access Token.
```bash theme={null}
headers: {
"API-KEY": bundle.authData.api_key; // original
}
```
Next, your API changes and expects the request property to be `X-API-KEY` instead. You can change the request property key (left) as needed. But still refer to the original form field input (right).
```bash theme={null}
headers: {
"X-API-KEY": bundle.authData.api_key; // new - request key and field key can differ
}
```
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/auth-required.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add required authentication field
## Change scenario
You'd like to add, remove, or change an optional input field to be required in your current authentication schema.
## Impact to users
This will cause a breaking change which will have the following significant effects to users:
* Existing connected accounts will not work: All existing connected accounts will no longer be functional with your integration until users re-authenticate manually.
* Manual updates are required for all Zaps: Zaps cannot be migrated due to a breaking change, users will have to edit each Zap individually before they can start running tasks again. For example, if a user has 20 Zaps set up with your integration, they will need to manually update each one of those Zaps.
## Best practices
* **Add the field as optional:** Use field \[help text]\(/ and [custom error handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-handling) (if you're using our Code Mode or the CLI platform) to validate that the newly required field is provided, while keeping it set to optional. Also, consider using custom code to set the field's default value in your API call if left blank.
* **Set a default value:** If possible, provide a default value for the required field that can be overwritten if necessary. This ensures that users who do not provide explicit values for these fields can continue to use your integration without issues.
For example in the case of updated API endpoints for geographical region or site domain, it is possible to account for an added **required** inputField with scripting to ensure existing authentications are backward compatible, allowing existing users to be migrated to the new version.
In this example code, the default URL for US region is updated when the user selects AU or CA when authenticating.
```js theme={null}
let baseURL = "theUsApiBaseUrl";
switch (authData.region) {
case "AU":
baseURL = "theAuApiBaseUrl";
break;
case "CA":
//other regions can be easily supported by adding cases like this
baseURL = "theCaApiBaseUrl";
break;
default:
console.log("Legacy credentials are in use, defaulting to US Base URL.");
}
```
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/auth-scheme.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Change authentication type
> If your API's authentication method changes, you’ll also need to update how Zapier authenticates user accounts in your integration.
## Impact to users
Changing your integration's authentication type (e.g., Basic Auth, API Key, or OAuth) is considered a **breaking change**. Zapier does not currently support automatic migration between different auth types. This means that users would need to make a new connection to your integration and manually modify each of their Zaps.
Because of this implication, any authentication change should be planned carefully to minimize disruption.
## Best practices
**If you must change your authentication method**, we recommend the following:
### Designing a Smooth Transition
1. Ensure your API can support both the old and new auth methods during the transition period.
2. Avoid immediately invalidating the old authentication credentials (e.g., API keys) after issuing new ones, so users aren’t abruptly disconnected.
### Creating a New Version
* [Clone](/platform/manage/clone) your integration to create a new version.
* [Remove](/platform/build/auth#how-to-remove-or-change-zapier-integration-authentication-scheme) the current authentication method and implement the new one.
* Once tested and ready, [promote](/platform/manage/promote) this new version so new users connect using the updated auth type.
### Managing Existing Users
* If the old auth method can continue working for a while, keep the older version available. This allows users to maintain their existing connections temporarily.
* New Zaps will always default to the promoted version, so users will be asked to reconnect using the new auth type when setting up new workflows.
## What to do before changing auth types
Changing your integration’s authentication type has broad impact. Please [contact us](https://developer.zapier.com/contact) as early as possible to let us know your plans.
While we can’t currently guarantee support for migrating user accounts across auth types, starting the conversation early allows us to:
* Better understand your use case
* Provide tailored guidance
* Coordinate timing to reduce disruption for your users
## Deprecating legacy authentication scheme
If you plan to discontinue support for the old authentication method:
* You’ll need to [deprecate](/platform/manage/deprecate) the integration version that uses it.
* Be aware this may be disruptive for users and should be carefully planned.
* Make sure users are informed and given ample time to transition.
> NOTE: This process is not supported for apps built in the legacy web builder. To update the authentication method, you must rebuild all triggers, actions, and searches in the new builder. Simply deleting and re-adding the authentication method will not work with components built in the legacy builder.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/auth-scope.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Change OAuth scope
> How to add or remove OAuth scopes.
## Impact to users
When an action in a new version of your integration requires additional OAuth scopes, there is no way around asking users to reconnect existing connected accounts before they can use the new action.
You can remove scopes only if no actions need it anymore. Note that existing connected accounts may still have been granted the scopes, and will only lose them when they get reconnected.
## Best practices
Follow these steps to provide the best user experience when adding new scopes.
1. In the new version where you need the additional scopes, try using the action with a existing connected account, and use [error handling](/platform/build/errors) to ensure that the error message instructs users to reconnect the account.
2. In the new version, add the required scopes to the *Scope* field [in the UI](/platform/build/oauth#add-oauth-endpoint-configuration) or `scope` [in the CLI](https://github.com/zapier/zapier-platform/blob/main/packages/schema/docs/build/schema.md#authenticationoauth2configschema).
{" "}
Where possible, OAuth v2 authentication is the preferred scheme to simplify a user's account connection and minimize set up time. During the authentication flow via Zapier, a familiar popup window appears from your app to select their account or log in, then verify the connection. This fits the flow most modern apps use for integration authentication.
API Key authentication is next best. Users must be able to obtain their API key from your app without human intervention. Your integration won't be [approved for publishing](/platform/quickstart/private-vs-public-integrations) if your service requires users to email or call your team in order to receive an API key or access to your API.
Basic authentication, while acceptable, is the least appropriate authentication type to use for a third party service like Zapier, as users must type their account credentials directly into Zapier's UI.
For more custom authentication schemes, switch to the [Platform CLI](/platform/manage/export-cli).
## How to Remove or Change Type of Authentication Scheme
You cannot change an integration's authentication scheme directly. First, remove the existing integration's authentication scheme, then add a new authentication scheme.
> **Note:** You can only do this for a (new) integration version that has not yet been promoted and has less than 5 active users, since this will break connected accounts for the version. If an integration's authentication scheme needs to be changed, clone a new major version and add the new authentication. [Learn more](/platform/manage/versions)
To remove a Zapier integration's authentication scheme in the Platform UI, open the *Authentication* page. Click the gear icon beside the existing authentication scheme, click *Delete*, then confirm to remove the authentication.
{" "}
Then add your app's new authentication scheme to the Zapier integration instead.
> **Note:** Again, to not break connected accounts, you can normally not migrate existing users' Zaps and connected accounts to a new version that has a different authentication scheme. For public integrations that meet certain conditions, we can provide support to migrate connected accounts between authentication schemes. [Learn more](/platform/manage/auth-scheme)
## Common Authentication Error Messages
When the test API call to verify users' credentials is unsuccessful, an error message shows in the Test section of your Zapier integration. Zapier shows a simplified error message in the *Response* tab by default.
{" "}
The original API response with the full error message is shown in the *HTTP* tab under *Response Content*.
{" "}
The most common errors include:
### 404
The standard HTTP 404 `Not Found` error is commonly returned when:
* Test API endpoint URL is incorrect
* Test API call method is incorrect
{" "}
Verify both the API endpoint URL and the call method (typically `GET`). Ensure both are set to what your API expects, then click the *Save & Continue* button, and click the *Test Connected Account* button again.
### 401 or 403
The standard HTTP 401 `Unauthorized` or HTTP 403 `Forbidden` error is commonly returned when:
* User account credentials are incorrect, expired, or revoked
Try authenticating your app user account with Zapier again. Click *Connect an Account*, add credentials for an active account on the app, then try the test again.
{" "}
### 400
The standard HTTP 400 `Bad Request` error is often returned when:
* OAuth v2 Client ID and/or Secret are incorrect or expired
* Some other part of your request is malformed, particularly a token exchange request
Check the full error message from the error or Zapier's testing logs to see if it lists why the call failed, then correct that part of your authentication flow. Verify each part of your authentication flow is entered correctly, including the request headers, URL parameters, and request body for each part of your authentication flow.
{" "}
### Error Parsing Response
The *Error Parsing Response* error is commonly returned when:
* API returns non-standard and especially non-JSON output
* Test API endpoint URL is incorrect
{" "}
Verify the test API URL is entered correctly. If a normal webpage URL is entered in the test field, the site will return its raw HTML content to Zapier and that will likely result in this error. If you do change the URL, click *Save & Continue*, then test your connection again.
If your API call is correct and returning data in a format [Zapier does not expect](/platform/build/response-types), you will need to switch to [Code mode](/platform/build/code-mode) and add custom parsing for your API response. Under the *Test* API call in the top of your app's Authentication settings, click *Switch to Code Mode*, then add custom JavaScript code to parse your API response.
### Authentication Failed Task Timed Out
The *Authentication Failed* error, often including *Task Timed Out*, is commonly returned when:
* The API request does not return a response to Zapier within 30 seconds
* The API request is formatted incorrectly and the server does not respond with an error code
Check your Zapier test logs to see if it shows which URL timed out, then verify you've entered the correct URL in all of your integration authentication settings. Finally, check the API provider to see if their site or API are temporarily down.
If the request seems to be successful but the task still times out, your API call may be taking too long to respond, or could be returning more data than Zapier can parse within the time limit. Use a testing API call in authentication that returns as little data as possible, such as a `/me` call that returns the connected user's account data. Or, if your API supports pagination and/or filtering, enable that and have the API return only the most recent result. Then test again to ensure the call works successfully.
{" "}
### 500
The HTTP 500 error is the default, unformatted error that may be returned without specifying what went wrong or why. If you encounter this error, check the API endpoint URL that gave the error, and verify your API call is configured correctly with the expected URL params, HTTP headers, and Request Body.
{" "}
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/common-types/authentication.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# null
---
# Source: https://docs.zapier.com/platform/build/basicauth.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add authentication with Basic Authentication
> APIs using Basic Authentication will authenticate users with a username and password. In your Zapier integration using Basic Auth, Zapier includes the username and password credentials in the API request bundle every time Zapier polls an API endpoint for new data or posts new data to an API endpoint.
{" "}
Use Basic Auth if your API requires a username and password or other basic fields, needs no special configuration, and specifically if your API leverages “[HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)”. For further customization of your login flow or to request additional data from users, [API Key authentication](https://platform.zapier.com/docs/apikey) may be a better fit.
## 1. Build an input form
* Open the *Authentication* tab in Zapier visual builder and select *Basic Auth*.
{" "}
* The pre-built input form for Basic Authentication includes a username and password field already.
* Add additional fields if your API documentation requires it by selecting *Add Fields* and fill in the details for your field. Add the most commonly needed fields first, in the order users expect, as you cannot reorder fields once added.
{" "}
* Add the required *Key*, the name your API uses to reference this field.
* Fill in the optional fields, as appropriate, especially the *Label*:
– **Label**: A human-friendly name for this field that will be shown to users in the authentication form.
– **Required? (checkbox)**: Check if this field is required for successful authentication.
– **Type**: All input fields use the `string` text field by default; select `password` instead if you would like to obscure the data as users enter it.
– **Help Text**: Include details to assist users in authenticating with your app, especially if they may be unsure where to find the data needed within your app. Format text with [Markdown](https://zapier.com/blog/beginner-ultimate-guide-markdown/), and include a hyperlink if needed.
– **Input Format**: (optional) Help users figure out exactly what piece of data you need them to enter. For example, for [a subdomain](/platform/build/subdomain-validation), [https://.yourdomain.com/](https://.yourdomain.com/).
– **Default Value**: Include a value for this field to be used as a fallback. For optional fields, the default value is set on initial connection creation and used in the API call instead of missing or null values every time the Zap runs. For required fields, this value is used during connection creation, but not when the Zap runs (Zapier raises an error for missing/null values instead).
{" "}
* Input fields marked as password and all authentication fields with sensitive, private data such as both username and password from Basic Auth are automatically censored at runtime. These values are stored in the Auth bundle and used in API calls, but are replaced in Zapier's logs with a censored value like this `:censored:6:82a3be9927:`. Due to this, it is not possible to view the exact tokens or keys in Zapier's logs. To verify that the same token as was returned by the authentication, is being used in subsequent API calls; you can compare censored value characters, for example `:censored:6:82a3be9927:` would have the same value ending in 9927 when used in a subsequent call.
* Computed fields are not applicable to Basic Authentication and are only used with OAuth v2 and Session Auth.
* Each input field is listed with its label, key, type, and required status in your authentication settings. Click the field to edit it, or click the gear icon and select *Delete* to remove a field.
{" "}
* Once you've added all the input fields to your authentication form, select *Continue*
## 2. Add a Test API Request
* Add an API call to your API that requires no configuration, typically a `/user` or `/me` call. Add the URL for the API call, and set the call type, typically a `GET`. This will test the user-entered credentials to ensure it enables a successful API call to your app.
* The username and password input fields are automatically included in the URL Params and the HTTP Headers. Click *Show Options* to remove the details where they are not needed. It is typically not recommended to pass any sensitive information such as the password in the URL Params. Passing it through the headers or even the body is preferable.
{" "}
* To customize the test API request, select *Switch to Code Mode* and write custom JavaScript code to handle your test API call and the response parsing as needed. The first time you click the toggle, Zapier will convert your API call to code. If you switch back to Form Mode though, Zapier will not convert your code changes to the Form Mode, nor will any subsequent changes in the form be added to your code.
{" "}
## 3. Configure a Connection Label
Review [connection label documentation](/platform/build/connection-label) to optionally differentiate the app accounts users connect.
## 4. Test your authentication
Connect a valid user account to [test authentication](/platform/build/test-auth).
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/publish/benefits-guide.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Guide to Zapier Partner Program Benefits
> Zapier offers a variety of marketing and support benefits to partners. This cheat sheet is designed to help you understand when and how you can access each of these benefits as you unlock them.
## Accelerate your access to these benefits by embedding
**Unlock the benefits of the Zapier Partner Program faster by embedding your integration into your product via your help docs, integration pages, or blog posts.** There are two ways to do this:
1. If you're in Beta, you'll exit Beta the day after we detect a signup that originates from your embed
2. If you're already a Partner, you can access some of the benefits of the next tier faster if you meet these requirements:
* we detect a signup from an embed that originates on your site
* your integration has a Healthy or Exceptional health score
* your integration meets a minimum active user count (40 for early Silver benefits, 300 for early Gold benefits, 2,500 for early Platinum benefits)
Embedding your integration not only enhances your product's functionality but also fast-tracks your access to higher-tier benefits. It's our way of incentivizing partners to integrate with Zapier and reap the rewards sooner.
## Next steps
* Review your integration tier on the Partner Program page in the developer dashboard
* Plan benefit redemption around your integrations' marketing calendar (and keep track of the annual usage limit of each benefit)
* Highlight your integration in your product and marketing assets with our [partner embedding tools](https://zapier.com/l/partner/solutions)
## Benefits
### Support
#### Developer support
**Access to our Partner Support team**
Access to integration best practices through our dedicated Support team.
* **How to access this benefit:** Submit our [contact form](https://developer.zapier.com/contact)
* **Eligible tiers:** Bronze+
#### Priority developer support
**Get expert technical guidance to grow and improve your integration**
Request dedicated support for your integration and product roadmap from a Zapier Solutions Engineer. Technical troubleshooting and code review are available.
* **Eligble tiers:** Platinum
* **How to redeem:** Email [partners@zapier.com](mailto:partners@zapier.com) to redeem this benefit.
* **Opportunity:** Use this tailored benefit to approach adding new features or fixing new bugs on your integration, based on your product goals.
#### 1:1 integration advocacy session
**Unlock personalized guidance to elevate your integration and expand its impact**
Get expert 1:1 support from Zapier's Solution Engineering or Marketing teams to optimize your integration and boost visibility.
* **Eligble tiers:** Platinum
* **How to redeem:** Email us at [partners@zapier.com](mailto:partners@zapier.com) stating your interest in redeeming this benefit.
* **Best used:** Achieve more with less while keeping Zapier at the center of your automation journey. You'll uncover niche use cases that can help deliver new features and functionalities.
### Integration quality
#### Zapier Partner Sandbox
**Complimentary Zapier account for testing integration updates**
Access to a complimentary workspace with premium features, giving your integration team access to features to support the ongoing development and maintenance of your integration.
* **Eligble tiers:** Bronze+
* **How to redeem:** Submit the form linked at the top of the “Manage Team” page for your eligible integration on the developer platform.
* **Opportunity:** Use Zapier Partner Sandbox to test integration updates before promoting them to users.
### App directory
#### Get leads from Zapier's App Directory
**App directory listing lead generation button**
A “Learn More” button ([example](https://cdn.zappy.app/8a9c2c36af184c011c6377dbd7b8d54c.png)) is added to your app's listing in the App Directory. This way, anyone who lands on this page can directly visit your site for more information on your product.
* **Eligble tiers:** Silver+
* **How to redeem:** Automatically redeemed for you. Customize this button with UTM parameters of your choice by submitting the form linked at the top of the "Integration Settings" page on the developer platform.
* **Opportunity:** Make it easy for potential users to explore your product with just one click through the “Learn More” button for enhanced lead generation.
#### Be a featured integration in the Zapier App Directory
**Featured Integration in the App Directory**
Boost your integration's exposure through a feature placement in our app directory ([example](https://cdn.zappy.app/c18cd47ae39d442aa2f6ea8aadc5cc82.png)).
* **Eligble tiers:** Silver+
* **How to redeem:** Select a 1-week period where you anticipate high customer engagement and email [partners@zapier.com](mailto:partners@zapier.com) requesting to redeem.
* **Opportunity:** Users are more likely to discover your integration when they're viewing your integration's category in our app directory.
* **Frequency:** Once every 365 days (rolling)
### Marketing
#### Integration announcements on the Zapier Community
**Community post inclusion of your integration updates**
We showcase new triggers, actions, and searches added to your integration, as well as user-reported issues closed with a “Resolved” statues in a monthly Community post.
* **Eligible tiers:** Silver+
* **How to redeem:** Automatically redeemed for you. We capture new triggers, actions, and searches added to your integration, as well as user-reported issues closed with a “Resolved” status, and include them in a Community post.
* **Opportunity:** Actively requests feedback from our mutual users on these updates, fostering direct engagement with users and enhancing the overall user experience.
* **Best used:** Don't miss a chance to promote these updates with your users, and engage with users by responding to their comments.
#### Spotlight in the weekly Zapier blog email newsletter
**Showcase your integration to 20,000 engaged Zapier users**
* **Eligble tiers:** Silver+
* **How to redeem:** Email us at [partners@zapier.com](mailto:partners@zapier.com) stating your interest in redeeming this benefit
* **Best used:** Extend the spotlight on LinkedIn by posting a screenshot of your banner, and be sure to tag @Zapier - we'll amplify it!
* **Frequency:** Once every 365 days (rolling)
#### Integraiton announcements on the Zapier Product Blog
**Blog feature of your integration updates**
We highlight new triggers, actions, and searches added to your integration in a monthly blog post (shared with a large Zapier audience).
* **Eligble tiers:** Gold+
* **How to redeem:** Automatically redeemed for you. We capture new triggers and actions added to your integration and promote them in the blog post.
* **Opportunity:** If you add a feature to an existing trigger or action that you think customers will love, send us an email.
* **Best used:** Don't miss a chance to promote these updates with your users by linking this announcement to a post on your networks.
#### Featured flyover in "Best of" blog post
**Spotlight your app in front of thousands of engaged automation users**
Get your app highlighted in a high-visibility card on a Zapier "Best of" blog post for one week, with your logo, name, and a direct link to your dedicated page in Zapier's app directory.
* **Eligble tiers:** Silver+
* **How to redeem:** Email us at [partners@zapier.com](mailto:partners@zapier.com) stating your interest in redeeming this benefit
* **Best used:** When launching a new feature or during strategic campaigns where added visibility can help boost engagement and conversions
#### Prioritized marketing inclusion
**Amplify your brand through curated, high-impact campaigns led by Zapier**
Get ahead with early access to Zapier-initiated co-marketing campaigns, giving your integration more exposure and engagement opportunities.
* **Eligble tiers:** Platinum
* **How to redeem:** Automatically included. We'll prioritize invites for Platinum Partners to participate in our co-marketing campaigns.
* **Opportunity:** Boost your integration's visibility and user engagement by being featured in high-impact marketing efforts.
* **Best used:** Take advantage of early access to promote your integration effectively across multiple channels.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/publish/best-practices.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Best practices for showcasing your integration
> Sharing well-crafted content about your Zapier integration can help you improve user adoption, highlight key use cases, and simplify integration processes. Need some inspiration? The following examples show how some of our partners are effectively communicating their Zapier integrations across different platforms.
## Go-to-market plan
A well-executed launch can drive immediate adoption of your Zapier integration. Create a coordinated campaign that reaches users through multiple touchpoints.
To launch effectively:
* Announce via email — Send a dedicated announcement to your user base highlighting your top 3-5 use cases
* Leverage social media — Share quick wins and time-saving examples across your social channels
* Enable your team — Provide your sales and support teams with key talking points
Ready to get started? [Generate your custom GTM plan](https://partnerforms.zapier.app/marketing-plan) to access ready-to-use messaging, templates, and best practices for launching your integration.
## Integration pages
A popular option for showcasing your integration is to create a dedicated, visually engaging landing page for Zapier on your website’s integrations directory.
To drive faster adoption, follow these best practices for your page:
* **Link to customer stories** — Share customer success stories that reference how Zapier has saved your users time and effort.
* **Add quotes** — Feature quotes that showcase how Zapier has driven meaningful improvements in users’ workflow efficiencies.
* **Embed Zap templates** — Show the most relevant use cases for your customers, and embed related Zap templates directly onto the page with our [embed tools](https://zapier.com/developer-platform/embed-tools). That way, users can easily build Zaps—without ever having to leave the integration page.
*Examples*: [BrightHR](https://www.brighthr.com/ca/integrations/zapier/), [SwagUp](https://www.swagup.com/integrations/zapier), [TrueReview](https://www.truereview.co/app/zaps), [Pipedrive](https://www.pipedrive.com/en/marketplace/app/zapier/10f6b602cda330ef)
## Help documentation
Write help documentation with clear, step-by-step instructions for integrating Zapier with your app.
These best practices can help your docs stand out:
* **Embed Zap templates** — Just like with your integration pages, embedding Zap templates directly in help docs can help reduce the friction of setup.
* **Be detailed** — Guide users who might be completely new to automation with detailed instructions.
* **Use visuals** — Keeping the docs visually engaging can complement your copy, building your users’ confidence even more.
*Examples*: [Jotform](https://www.jotform.com/help/how-to-use-zapier-with-jotform/), [Kajabi](https://help.kajabi.com/hc/en-us/articles/360037178613-How-to-Use-Zapier-With-Kajabi), [ClickSend SMS](https://help.clicksend.com/article/0to8xcbzq8-integrate-clicksend-with-zapier)
## Blog posts
Your blog is a fantastic space for communicating updates to your Zapier integration.
For the most engaging posts, apply these best practices:
* **Explore new features** — Announce new Zapier features in your posts and give users ideas about how they can apply those features to their work.
* **Spotlight benefits** — Inspire users by directly referencing which apps they can connect to through Zapier and how those connections support their work.
*Example*: [Buffer](https://buffer.com/resources/buffer-zapier-integration/)
## Video tutorials
A well-made video can help break down complex ideas into easily digestible concepts—perfect for explaining Zapier to new users.
Here are two great starter videos you can create:
* **Welcome to Zapier** — Create an introductory video that walks users through a high-level overview of Zapier to help get them started.
* **Setup deep dive** — Break down the technical setup process in a thorough, engaging tutorial.
*Examples*: Adalo ([Intro video](https://www.youtube.com/watch?v=2IrXNEJkvcQ\&t=2s), [deep dive video](https://www.youtube.com/watch?v=nS4C7-7D14M\&t=1s))
---
# Source: https://docs.zapier.com/platform/publish/branding-cli.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add integration branding in Platform CLI
> When you make a new integration in Zapier CLI, you can add the app's name, description, and homepage to the `package.json` file.
The rest of your app's branding needs to be added in Zapier's online Platform UI.
Focus first on building your integration. When you've added your app's core details, authentication, triggers, and actions, push your integration to Zapier with a `zapier-platform push` (or deprecated `zapier push`) command. Zapier will use the name you added in the CLI integration settings, along with a placeholder icon for your app.
Then, before launching your integration, add your app's branding via Zapier's Platform UI at [zapier.com/app/developer](https://zapier.com/app/developer). There you will see every Zapier integration you've built. The top *Integrations* section includes every app you've added via Zapier's Platform UI or CLI. Look for the integration you built with Zapier CLI and click its name.
You can't edit authentication, triggers, and actions in Zapier's Platform UI for integrations built with Zapier's CLI. But you can edit branding.
To do that, click the gear icon in the upper left hand corner near your app's name and placeholder icon. You can then edit your integration's name and description, and upload your app's icon (a square, transparent PNG at least 256x256px). Below that, you can set your app's category and other brand settings. Click *Update* to save your settings.
You can then make further changes to your integration in your Zapier CLI code and push them to Zapier anytime without affecting your branding. If you ever need to change your app icon or other branding again, just come back to the [Zapier Platform UI](https://zapier.com/app/developer) and edit it as before.
*→ Check [Zapier's app logo, name, and description guidelines](https://platform.zapier.com/partners/planning-guide#app-logo) to ensure your app's branding fits into the Zapier platform.*
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/publish/branding-guidelines.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Integration branding guidelines
> When creating your integration, you'll add your app’s name, logo, description, category, and primary brand color. Consistent branding is essential for helping users recognize and discover your app on Zapier.
The journey starts at the [Zapier app directory](https://zapier.com/apps/), where apps are ranked by popularity and category. Users search for new apps and integrations here.
Each integration gets its own app profile page on Zapier, where your branding
stands out. Users can explore your app’s features and see how it works with
other apps.
App profiles feature [Zap Templates](https://platform.zapier.com/publish/zap-templates)—pre-built workflows that users can set up with just a few clicks. These templates are also shown in the Zapier dashboard for connected apps.
Inside Zapier's account dashboard, the *Start with a template* section shows Zap Templates for apps users have connected to their accounts.
In the Zap editor, your app’s logo and name appear when users select apps to connect.
Follow these guidelines to ensure consistent, effective branding for your Zapier integration:
## App name
When possible, use your app’s current, public-facing name as it appears in your official branding. The app title on Zapier should match your actual app name, including correct capitalization and spacing. Do not include extra words or symbols like ™, ®, or © in the title.
Avoid adding adjectives, descriptors, or phrases unless required to distinguish between similarly named integrations. Only include your company name if it’s inseparably tied to your product branding.
Do not include the word “app” unless it is part of your official name. Abbreviations like FKA (formerly known as), AKA (also known as), and NKA (now known as) are not permitted. If your integration is rebranded, its title must use only the new name without referencing the previous name.
When naming collisions occur, i.e. when another integration already uses the same name, a tiered approach will be applied to distinguish your app while preserving brand clarity:
**Tier 1 (Preferred)**: App Name
Use this when your app name is unique across the Zapier platform and no other integration uses it. Examples:
* Evernote
* Google Sheets
* Trello
**Tier 2 (Next-best)**: App Name by Company
Use this if your app’s name is already taken and your company name is distinct from your product name. This helps differentiate between similar apps by clarifying the brand behind them. Examples:
\_ Ecwid by Lightspeed
\_ Bigin by Zoho CRM \* Grok by xAI
**Tier 3 (Last-resort)**: App Name (Descriptor)
Use this if both your app and company names are the same, and a name conflict exists. Add a short, descriptive tag that clearly differentiates your app. This could include your product’s category, function, or platform. Examples:
\_ Pulse (Business Chat)
\_ Pulse (Health Track)
\_ Nimbus (Notes & Docs)
\_ Nimbus (Weather)
## App logo
The logo you provide will be used across Zapier’s platform, including on your app’s dedicated directory page. Please ensure the logo you provide meets the following requirements:
* PNG, transparent
* Minimum 512x512px (identical height/width measurements)
* Minimum 72 DPI
This will ensure your logo displays properly throughout the site.
Please provide a bigger version if you have one available. If your icon is not square, make a square transparent image and center your icon inside the transparent square. Do not include the app name or other copy in the logo as it will not be legible at small sizes.
**Example**:
Evernote's elephant icon is included in a transparent square rectangle.
Todoist's icon includes transparent, rounded corners.
## App description copy
Write a short description (up to 160 characters) of your app’s core features and use cases in the form of "**Integration Name** is a....". The description should be less about selling the platform and more about what the platform actually does. Use proper English and full sentences. The copy should not include links or mentions of Zapier. Do not use flowery or overstated language, or make it appear your integration is associated with or endorsed by Zapier.
**Example**:
* `Trello is a team collaboration tool to organize anything on a kanban board.`, not `Trello is the best project management tool.`
* `Dropbox lets you store files online, sync them to all your devices, and share them easily.`, not `A file storage app.`
## Category
Select the category that best fits your app's core features and use case. If your app includes features from multiple categories, choose the category that best describes your app's primary use case today.
You may update your app's category in the future if needed, so do not select a category that fits your future ambitions for the app instead of its features today. Additionally, do not select a category that applies only to a secondary feature in your app or a narrow category that does not cover your app's broader focus.
### Available Categories
We offer a variety of categories for you to list your integration in. Each top-level category includes all integrations from its child categories. To maximize visibility for your integration, we recommend selecting a specific child category rather than a general parent category. Integrations within each category are ranked by popularity. By choosing a child category, your integration can achieve a higher ranking and greater visibility within that category.
* Artificial Intelligence - Tools that offer AI features such as natural language processing, image classification, and more.
* AI Agents - Tools that use AI to take action and complete tasks.
* AI Assistants - Tools that act as digital helpers for everyday tasks.
* AI Chatbots - Conversational bots that answer questions and automate support.
* AI Content Generation - Tools to create text, images, audio, or video with AI.
* AI Document Extraction - Tools that extract structured data from documents and files.
* AI Meeting Assistants - Tools that record, transcribe, and summarize meetings.
* AI Models - Services to build, host, or access AI/ML models.
* AI Safety, Compliance, Detection - Tools to detect AI content, moderate risks, and ensure compliance.
* AI Sales Tools - AI tools to find, qualify, and engage leads.
* AI Web Scraping - Tools that use AI to collect and structure web data.
* Model Context Protocol (MCP) - Tools built on the Model Context Protocol (MCP) standard.
* Business Intelligence - Tools to gather, analyze, and visualize business data.
* Analytics - Tools to measure and report on success.
* Dashboards - Tools to view your data on a full-screen dashboard.
* Reviews - Tools to manage your reviews and ratings.
* Commerce - Tools to facilitate all aspects of business transactions, both online and offline.
* Taxes - Tools for automating your taxes.
* Accounting - Tools for accounting and finance.
* eCommerce - Tools to sell your products online.
* Fundraising - Tools to set up fundraising events and projects.
* Payment Processing - Tools to process payments on your site or app.
* Proposal & Invoice Management - Tools to create and send proposals and invoices to clients.
* Communication - Tools to streamline and enhance communication across various channels.
* Call Tracking - Tools to monitor calls and track data from non-digital marketing campaigns.
* Email - Tools to manage your personal and business email correspondence.
* Fax - Tools to send documents over fax.
* Notifications - Tools to get customized notifications on your computer or mobile devices.
* Phone & SMS - Tools to make calls and send SMS messages.
* Team Chat - Tools to help teams collaborate together online with real-time chat.
* Team Collaboration - Tools for business social networking, file sharing, and chat to help teams work together more effectively.
* Video Conferencing - Tools to host team video calls and webinars.
* Content & Files - Tools to create, manage, and share various types of content and files.
* Documents - Tools to write, edit, and share text documents.
* File Management & Storage - Tools to organize, share, and sync files.
* Images & Design - Tools for creatives and those dealing with images.
* Notes - Tools to write down thoughts and organize them in notebooks.
* Transcription - Tools to transcribe audio into text.
* Video & Audio - Tools to store and share multimedia assets.
* Human Resources - Tools to manage all aspects of human resources, from hiring and recruitment to employee management and development.
* Education - Tools to enhance learning and teaching experiences
* HR Talent & Recruitment - Tools to manage your hiring and human resource department.
* Internet of Things - Tools to connect and manage IoT devices and services.
* Devices - Tools for connecting Internet of Things devices through Zapier.
* Printing - Tools to print your designs, either on your printer or on products such as t-shirts and stickers.
* IT Operations - Tools to manage and optimize IT infrastructure and services.
* Databases - Tools for developers to store and manage data.
* Developer - Tools to build and maintain software, services, and websites.
* Online Courses - Tools to publish lessons and educational material.
* Security & Identity - Tools to manage security and identity/permissions
* Server Monitoring - Tools that monitor services and application metrics.
* Lifestyle & Entertainment - Tools to enhance various aspects of your personal life and leisure activities.
* Fitness - Tools to track your workouts, food, and more.
* Gaming - Tools that are centered around video gaming.
* News & Lifestyle - Tools to keep you informed on news and lifestyle content.
* Marketing - Tools to plan, execute, and measure marketing campaigns across various channels.
* Ads & Conversion - Tools to track and reach an audience online.
* Drip Emails - Tools to send automated email messages on a set schedule.
* Email Newsletters - Tools to send regular email updates and newsletters to your subscribers.
* Event Management - Tools to manage events and attendees.
* Marketing Automation - Tools to market products, track interests, and turn visitors into customers.
* Social Media Accounts - Tools to connect and share with others online.
* Social Media Marketing - Tools to automatically share posts on social networks.
* Transactional Email - Tools to send email messages through your application.
* URL Shortener - Tools to shorten URLs.
* Webinars - Tools for scheduling and holding webinars.
* Productivity - Tools to enhance efficiency and organization in your personal and professional life.
* Bookmark Managers - Tools to save your favorite links to view and read later.
* Calendar - Tools to plan your events and schedule.
* Product Management - Tools to plan your product's lifecycle and roadmap.
* Project Management - Tools for managing projects.
* Spreadsheets - Tools to manage numbers and data.
* Task Management - Tools to manage your tasks on simple lists.
* Time Tracking Software - Tools to track time spent on work and projects.
* Sales & CRM - Tools to manage and optimize your sales processes and customer relationships.
* Contact Management - Tools to keep track of the people you need to keep in touch with most.
* CRM (Customer Relationship Management) - Tools for customer relationship management.
* Forms & Surveys - Tools to build forms and gather data from your website or apps.
* Scheduling & Booking - Tools to schedule appointments and events.
* Signatures - Tools to manage and sign legal documents online.
* Support - Tools to enhance customer satisfaction and provide effective assistance.
* Customer Appreciation - Tools that help you show appreciation to your customers.
* Customer Support - Tools to answer your customers' questions through email, chat, and documentation.
* Website & App Building - Tools to create and customize websites and applications.
* App Builder - Tools to build a custom app with forms and databases.
* Website Builders - Tools to help manage content and build websites for your business.
**Example**:
* *Gmail* is primarily an app to send and receive email messages, so it fits best in the `email` category alongside services like *Microsoft Office 365*, not in the `email newsletters` category with *Mailchimp*.
* *Slack* is primarily a team communication tool for chat, so it fits best in the `team chat` category alongside apps like *Discord* and *ChatWork*, not in the `video calls` category even though it does include a video call tool as a secondary feature.
* *Google Contacts* is primarily an address book that fits best with other `contacts` apps, while *HubSpot CRM* can manage contacts but also includes deals and contact tracking which makes it a better fit for the `CRM` category.
## Colors
When you release your Zapier integration to the public, Zapier requires your app's primary color. The primary color is the main color used in your app's logo or branding.
Do not use pure white (`#FFFFFF`) as the color, as overlaid text would be unreadable. If your logo is black and white, use the next most common color from your branding.
Zapier uses the primary color as the background color in your app's Zapier App Directory listing, and may additionally use it in the Zapier app dashboard, Zapier blog marketing materials, and other parts of Zapier's app and content that promote your app's integrations.
## Frequently Asked Questions
The triggers, actions, and searches are identified by their **key**, such as `new_contact` or `create_post`, so if you remove that key from the app's definition, or change it (possible in CLI apps only), this message appears when you attempt to migrate.
## Best practices
* If you have already renamed the **key** (possible in CLI apps only) for a trigger/action/search, you'll need to switch it back to the previous **key** to proceed with migrating users.
* If you need to remove a trigger/action/search, change its visibility to **hidden** instead. Use the Visibility Options dropdown in the [UI](https://platform.zapier.com/polling-trigger#1-add-the-trigger-settings), or the `hidden` key in the [CLI](https://github.com/zapier/zapier-platform/blob/main/packages/schema/docs/build/schema.md#basicdisplayschema).
Migrated Zaps that used the hidden trigger/action/search will now show it as Deprecated in the Zap editor, but will continue to function as long as the endpoints remain valid.
Once a user selects a different trigger/action/search when editing their Zap, they will not be able to retrieve the hidden one. New users will not see any `hidden` trigger/action/search as available for selection.
* If you need to add a new trigger/action/search that replaces the hidden one, create a duplicate and give it a new **key** (such as appending `_v2` on the end), and keep the Name and Description the same if the functionality for a user is the same.
* This way existing Zaps continue to work once migrated with the previous (and now hidden) definition, and new Zaps will only be able to select the new definition.
* In cases where the endpoint in the hidden trigger/action/search will be sunset and begin to return errors in the future, the impact to users would be as follows:
Once the API has been sunset, active Zaps (turned on) using the impacted trigger/action/search will produce errors when they run. Depending on [user's email notification settings](https://help.zapier.com/hc/en-us/articles/8496289225229), owners of these Zaps will be sent email notifications about these errors.
If those Zaps exceed the error ratio **and** users have not [overridden related settings in their Zaps](https://help.zapier.com/hc/en-us/articles/8496037690637-Troubleshoot-errors-in-Zapier#i-want-my-zap-to-continue-running-even-when-there-are-errors--0-6), those Zaps will be automatically turned off.
* If you'd like to add custom errors within Zapier for the hidden trigger/action/search at the time of the endpoint sunset, you could consider the following:
Create a new version of the integration that immediately throws a `z.errors.Error` exception in the `perform` method of the impacted trigger/action/search. Learn more for apps maintained in the [UI](/platform/manage/planning-changes#custom-error-handling-in-the-ui) or the [CLI](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#zerrors).
*Promote* and then *migrate* users to this new version as close to the sunset date as possible.
The benefits of this approach are:
* Throwing an explicit exception will ensure impacted Zaps will hit the error ratio (and be turned off) at the earliest possible time.
* You can add a user-friendly message to the exception that users will see in both Zaps Runs on the [Zap History](https://help.zapier.com/hc/en-us/articles/8496291148685-View-and-manage-your-Zap-history) and also in email error notifications, e.g. *This function has been deprecated and is no longer available.*
* Here's an example of how a custom error message would be displayed on an action in the Zap History:
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/change-perform.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Update perform method for polling trigger
## Change scenario
It is generally safe to update a polling trigger's [perform method](https://github.com/zapier/zapier-platform/blob/main/packages/schema/docs/build/schema.md#basicpollingoperationschema) (Platform CLI) or [API Configuration](/platform/build/polling-trigger) (Platform UI), as long as the changes maintain backward compatibility in the returned response data. This means that the output fields and output data structure should remain consistent with previous version's.
## Impact to users
Updating a polling trigger's perform method or API Configuration might cause deduplication issues and cause old records to trigger a Zap if any of the following changes occur:
* The [primary key](/platform/build/deduplication) (usually an `id` field) is changed or removed from the API response.
* The perform method's endpoint is modified, resulting in fundamental changes to the primary key value.
For example, if the API or endpoint previously returned dedupe IDs as integers -1,2,3,4 - and is now updated to return alphanumeric values - 1-abc, 2-bcd, 3-cde, 4-def - records that were previously processed will fire again since the new IDs aren't saved in the deduplication table that Zapier references during each poll.
## Best practices
* Ensure the primary key remains unchanged: If the API response changes the primary key, use [custom code](/platform/build/deduplication#custom-primary-keys) to maintain consistency and prevent deduplication issues.
* Maintain reverse chronological order: the trigger should continue to return data in reverse chronological order to prevent unintended records triggering the Zap.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/change-trigger.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Change trigger from polling to REST Hook
## Change scenario
Your app needs to change how it notifies Zapier of new records - changing the type of trigger - from Zapier polling an app endpoint for new items to instead a REST Hook subscription where the app notifies Zapier of new records; or vice versa.
## Impact to users
This is a breaking change. Edits to an existing trigger's type will cause your users' Zaps to stop working and they would need to create new Zaps with the new trigger type, and manually re-create their actions. Using the [Duplicate feature](https://help.zapier.com/hc/en-us/articles/15408145778829-Duplicate-your-Zap) would help, but each Zap would need to be mapped individually with the new trigger.
## Best practices
* Copy the trigger configuration into a new trigger and give it a new **key** (such as appending `_v2` on the end), change the type for this new trigger, and **hide** the previous trigger. This way existing Zaps continue to work with the previous (and now hidden) trigger definition, and new Zaps will use the new trigger definition.
* This is the recommended path forward whether using the Platform UI or the Platform CLI, with the only difference being using the *Visibility: Hidden* toggle in the UI and setting the `hidden` key as `true` [in the CLI](https://github.com/zapier/zapier-platform/blob/main/packages/schema/docs/build/schema.md#basicdisplayschema).
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/changeset-workflow.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Integration CI Pipelines using Changesets and Snapshot Versions
> Use changesets with snapshot versions to set up an automated pipeline for integration version updates.
5. From the dropdown menu, select **Clone**.
6. The *Clone Version* dialog box will appear. In the dropdown field, select which **version** you want to clone your existing version too.
* **Patch (e.g., 1.0.0 to 1.0.1)**: Ideal for backward-compatible changes such as bug fixes or updating help text.
* **Minor (e.g., 1.0.0 to 1.1.0)**: Use this for adding new functionalities that do not disrupt existing features, like creating a new trigger or action.
* **Major (e.g., 1.0.0 to 2.0.0)**: Choose this option for changes that are likely to break existing Zaps, like removing triggers or actions, altering authentication methods, or revamping the entire integration.
7. Click **Clone**.
8. A dialog box will appear confirming you've cloned your version.
Now you can make edits and improvements to your integration.
## Video Tutorial
You can refer to this video on cloning an integration version:
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/reference/cloning-a-version-tutorial.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Cloning a version
> Cloning allows you to duplicate an existing version of your integration. This is particularly useful when you want to introduce new features or fixes without altering the original integration. When a previous version of your integration has more than 5 active users, you will need to clone that version to make modifications.
---
# Source: https://docs.zapier.com/platform/build/code-mode.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Use Code Mode to refine your API call
In the Platform UI, when building your authentication, triggers and actions, you will create each component of your integration using Form Mode. However if you need to add further customization to your API calls, you can use Code Mode.
You can use Code Mode to:
* Transform your API response into JSON format
* Add user authentication details and input form data to the API call
* Use ‘z' object library to customize your API call
* Improve error response handling
## Getting started with Code Mode
To use Code Mode, Zapier recommends for users to have an understanding of Javascript and making [HTTP requests](/platform/reference/cli-docs#making-http-requests).
Code Mode is available to use in the API request settings:
* For authentications, Code Mode is in the *Configure a Test Request & Connection Label* setting. Note, for OAuth v2, Code Mode is in the *OAuth v2 Endpoint Configuration* setting.
* For triggers and actions, Code Mode is in the *API Configuration* setting.
Changes made in Code Mode are not saved automatically. Once you have added the code you want, click **Save & Continue**.
## Capabilities of Code Mode
### Use `z` object to customize your API call
You can write JavaScript code, using Zapier's default code as a base or writing custom code. Use the `z` object for Zapier specific features, including `z.console` to write to the console log, `z.JSON` to parse JSON and `z.errors` to handle errors. Learn more in [Zapier's CLI Z Object docs](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#z-object).
### Add user authentication details and input form data
You can use Zapier bundles to access authentication data, data from user input forms and request data. Learn more in [Zapier data bundles](https://platform.zapier.com/docs/advanced#bundle).
### Importing libraries
You can import from Node's standard library with `z.require`, for example, `z.require('querystring')` or `z.require('crypto')`. Zapier strongly recommend you keep it simple when coding in Platform UI. Building and testing complex code is better suited with the Platform CLI.
NPM modules are not supported within the Platform UI. You'd need to export your project to [Platform CLI](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md) and use `npm` to add additional libraries.
### Performance considerations
Each trigger and action has a 30 second time limit. To ensure that Zaps run smoothly, keep your custom code as lightweight and efficient as possible. If your code takes longer than 30 seconds to run, it will time out and user's Zaps will error. We also can't guarantee that all imported libraries will be supported within our runtime environment.
Here are some specific things you can do to improve the performance of your custom code:
* Use efficient algorithms and data structures.
* Avoid unnecessary loops and recursions.
* Optimize your code for the specific task it is performing.
* Avoid using imported libraries that are not essential to triggers or actions.
### Error handling in Code Mode
When working in Code Mode, it's important to handle errors correctly so that Zapier can respond appropriately and ensure Zaps run as expected. While it might feel natural to throw a standard JavaScript `Error`, this will not work as expected in Zapier integrations. Instead, you should use the `z.error` error classes provided by the platform.
**Don't**
```javascript theme={null}
if (response.status === 401) {
throw new Error("Authentication failed. Please reconnect your account.");
}
```
**Do**
```javascript theme={null}
if (response.status === 401) {
throw new z.errors.RefreshAuthError();
}
```
Learn more in the [CLI Error Handling docs](https://docs.zapier.com/platform/build-cli/overview#error-handling).
## Switching between Form Mode to Code Mode
When you switch to Code Mode, Zapier uses your code when making API calls. Any previous settings from Form Mode will not be discarded. This is because Form Mode and Code Mode cannot be used together.
If you switch back to Form Mode, click **Switch to Form Mode**. Your previous Form Mode settings will be restored. Zapier will save the code you entered in Code Mode so you can use it again if you switch back to Code Mode.
## Code Mode resources
Here are some resources that will be helpful when using the code mode:
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/computed-test-field.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Compute a field from the data of the Test API call
> Zapier doesn't store the responses from the test API call for OAuth v2 and session authentication. Using computed fields, you can use data from a test API call later in your Zapier integration.
## Prerequisites
* Knowledge of working with APIs
* Understanding of computed field concept
* Familiarity with JavaScript
## Steps
1. Log into the [Platform UI](https://zapier.com/app/developer).
2. Select your **integration**.
3. In the *Build* section in the left sidebar, click your **authentication**.
* For Session authentication:
* Click **Configure a Token Exchange Request**
* Click **Switch to Code Mode**.
* For OAuth v2 authentication:
* Click **Add OAuth v2 Endpoint Configuration**.
* Click **Switch to Code Mode**.
4. Add **custom JavaScript code** to instruct Zapier to call both the URLs necessary for the authorization process and your test API call.
5. Click **Save & Continue**.
6. The *Test Request* section remains unchanged.
7. Return [computed fields](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#computed-fields) for data returned from either API call so you can reference those fields in subsequent steps as `bundle.authData.field` where `field` is the field's name from your test API call response.
Upon completion, you will be able to use data from a test API call as a computed field in later stages of your Zapier integration.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/embedding-zapier-mcp/guides/connecting-your-agent.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Connecting Your Agent
> Learn how to connect your agent to Zapier MCP servers.
## Prerequisites
* A configured authentication scheme in the Platform UI
## Steps
1. Enter your desired value into the *Connection Label* field in the authentication configuration, as the name of the field, surrounded by double curly braces
2. Zapier always includes the app's name in each account label, so it is redundant to add any hard coded app name into your connection label.
3. Instead, add either:
* Data that users enter in the authentication form
* Output fields from your app's authentication test API call
For example, if your auth configuration includes a `username` field, your connection label could look like:
`{{username}}`
Alternatively, you can use an output field from your test API call in the Connection Label. If you aren't sure what fields will be returned, you'll want to test your authentication first, and return to the connection label.
After connecting an account, check the *Response* tab to see the fields returned from the test request.
4. Field keys from the authentication form and the test request are both pulled up to the top level.
You can also refer to the fields with `{{bundle.authData.field}}` for input fields from the authentication form, replacing `field` with your input field key. Use `{{bundle.inputData.field}}` for fields returned from the test request, replacing `field` with the field key from the API response.
If you need to use a nested field from your API call results, reference it as `field.nestedfield`. For example, if your test API response includes a `name` field nested under `details`, you would reference it as:
`{{bundle.inputData.details.name}}`
Any field your authentication test API call returns can be used in the connection label. The best fields to use are usernames, domain names (if your app is self-hosted), account numbers, email addresses, or other identifiable but not fully private data. Never use passwords, API keys, or other critical, private info in connection labels.
5. Customize your connection label further with JavaScript code as needed.
Custom code for connection labels is best used for:
* Using code to manipulate data from an auth or test call before using it in a connection label, such as to format a number or date
* Logging additional data
* Making a new API call to access data to use in the connection label
Select *Edit Code* to switch to *[Code Mode](/platform/build/connection-label)*. When\_Code Mode\_ is enabled, Zapier will only use the code to create your connection label, and will ignore any text that was in the *Connection Label* field in the regular string mode.
To switch back to the regular string field, click the *Delete Code* button to delete your custom connection label code and revert to using the text entered in the *Connection Label* field.
When writing code for the connection label, fields are not pulled up to the top level of the `bundle` object - use `bundle.authData` for auth input fields, or `bundle.inputData` for fields returned from the test API request. For example, your code might look like this:
```bash theme={null}
return bundle.authData.username;
```
```bash theme={null}
This is equivalent to using `{{username}}` in the regular string mode.
Add custom data to Zapier's console log with the `z.console.log` function to assist with testing and monitoring your app authentication.
```
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build-cli/core.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Core reference
> Reference for `zapier-platform-core`
Most functions get called with `(z, bundle)`. This document is a reference for how to use these objects.
> If you use TypeScript, you can import `ZObject`, `Bundle`
// in the URL parameters. At this point you will need to
// exchange the OAuth code for an OAuth token.
const popup = window.open(
url.href,
// If you give an opened window a name, it will prevent there
// from being more than one window open at the same time with
// that name. The new URL supplied to `open` will navigate
// existing window.
"zapier-authorize",
// Ensure a comfortable amount of space in the popup
"width=1024,height=1280",
);
if (!popup) {
alert("Failed to open popup window. Please allow popups and try again.");
}
const data = await waitForPopupClose(popup);
}
/**
* Waits for the given popup window to close,
* or for it to send a message that passes the `callback` function supplied.
*
* @param {Window} popup - The popup window created by `window.open`
*/
async function waitForPopupClose(popup) {
return await new Promise((resolve) => {
function onMessage(event) {
if (
typeof event.data === "object" &&
event.data &&
event.data.type === "zapier.popup.close"
) {
popup.close();
finishAndCleanUp(event.data);
} else {
console.warn("unhandled message event: (data)", event.data);
}
}
function finishAndCleanUp() {
resolve(undefined);
removeEventListener("message", onMessage);
clearInterval(interval);
}
// Wait for `postMessage` event
addEventListener("message", onMessage);
// Wait for popup to be closed if the message wasn't received
const interval = setInterval(() => {
if (popup.closed) {
// The interval may have run after the popup closed and before onMessage
// had a chance to process messages. This prevents a frequent race
// condition in Firefox, where finishAndCleanUp was called here before
// onMessage could call finishAndCleanUp.
setTimeout(() => {
finishAndCleanUp(undefined);
});
}
});
});
}
```
## Redirect URI page example
The redirect URI page must exchange the OAuth code for an OAuth token within 2
minutes. The resulting token MAY NOT be stored in an insecure manner. The
suggested location is in your application's database, in a data model for the
current user.
See the [OAuth 2.0 Token
Exchange](https://datatracker.ietf.org/doc/html/rfc8693) RFC for more detail.
```js theme={null}
const url = new URL(request.url);
const code = url.searchParams.get("code");
const token = await EXCHANGE_CODE_FOR_TOKEN(code);
await SAVE_TOKEN_TO_DATABASE(CURRENT_USER_ID, token);
```
## OpenAPI
````yaml https://api.zapier.com/schema get /v2/authorize
openapi: 3.1.0
info:
title: Partner API
version: 2024.11.0
description: >
## Introduction
The Partner API is the best tool for complete style control over a user's
Zapier experience within your app.
Essentially, it lets you customize how you present Zapier within your
product without sacrificing your app's look,
feel, and flow.
Think of it as a native Zapier integration, helping you showcase your best
Zapier-powered workflows where it's most
helpful to your users (within the flow of your tool). You can customize
styling, streamline Zap set-up for users,
expose relevant Zap information, and more!
With the Partner API, you can:
- Get a list of all the apps available in Zapier's app directory so you can
power your app directory and show your
users all the integration possibilities with your Zapier integration.
- Have complete style control over how you present Zap templates in your
product. The Partner API gives you access
to the raw Zap Template data so you can give your users access to your Zap
template with your product's style, look
and feel.
- Get access to all your Zap templates and give your users the ability to
search to quickly find the one they need.
- Streamline Zap setup by pre-filling fields on behalf of your users.
- Show users the Zaps they have set up from right within your product
keeping them on your site longer and giving them
complete confidence in their Zapier integration.
- Embed our Zapier Editor to allow your users to create new Zaps and modify
existing ones, without needing to leave
your product.
## Authentication
There are two ways to authenticate with the Partner API.
1. Your application's `client_id` which you will receive once you are
approved for access to the API
(Client ID Authentication)
2. A user's access token (Access Token Authentication).
Which authentication method you should use depends on which endpoint(s) you
are using.
Review each endpoint's documentation to understand which parameters are
required.
> Note: while we do generate a `client_secret`, the type of grant we use
(implicit) doesn't
need it so it's not something we provide.'
## Learn more
See the [Workflow API
documentation](https://docs.zapier.com/partner-solutions/workflow-api/intro)
for more information.
contact:
name: Zapier
url: https://developer.zapier.com/contact
servers:
- url: https://api.zapier.com
security: []
tags:
- name: Accounts
description: Refers to resources interacting with 'Accounts' associated resources
- name: Actions
description: Refers to resources interacting with 'Actions' associated resources
- name: Apps
description: Refers to resources interacting with 'Apps' associated resources
- name: Authentications
description: >-
Refers to resources interacting with 'Authentications' associated
resources
- name: Categories
description: Refers to resources interacting with 'Categories' associated resources
- name: Experimental
description: Refers to resources interacting with 'Experimental' associated resources
- name: Inputs
description: Refers to resources interacting with 'Inputs' associated resources
- name: Outputs
description: Refers to resources interacting with 'Outputs' associated resources
- name: Zaps
description: Refers to resources interacting with 'Zaps' associated resources
- name: Zap Templates
description: Refers to resources interacting with 'Zap Templates' associated resources
paths:
/v2/authorize:
get:
tags:
- Accounts
summary: Create Account
description: >-
Create a new user and obtain an access token. See our Quick Account
Creation guide to get started.
operationId: v2_authorize_list
parameters:
- in: query
name: client_id
schema:
type: string
minLength: 1
description: Your application Client ID.
required: true
- in: query
name: redirect_uri
schema:
type: string
minLength: 1
description: The page the user will be redirect to after OAuth flow.
required: true
- in: query
name: referer
schema:
type: string
minLength: 1
- in: query
name: response_type
schema:
type: string
minLength: 1
description: Only OAuth response type `code` is supported
required: true
- in: query
name: scope
schema:
type: string
minLength: 1
description: Space (`%20`) separated values
required: true
- in: query
name: sign_up_email
schema:
type: string
format: email
minLength: 1
description: Email of the user signing up.
- in: query
name: sign_up_first_name
schema:
type: string
minLength: 1
description: First name of the user signing up.
- in: query
name: sign_up_last_name
schema:
type: string
minLength: 1
description: Last name of the user signing up.
- in: query
name: utm_campaign
schema:
type: string
default: workflow_api
minLength: 1
- in: query
name: utm_content
schema:
type: string
minLength: 1
- in: query
name: utm_medium
schema:
type: string
default: embed
minLength: 1
- in: query
name: utm_source
schema:
type: string
default: partner
minLength: 1
responses:
'302':
description: Redirect to authorization URL
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
MalformedRequest.:
value:
errors:
- status: 400
code: parse_error
title: ParseError
detail: Malformed request.
source: null
meta:
source: ZAPIER
full_details:
message: Malformed request.
code: parse_error
summary: Malformed request.
description: This schema can be expected for 4xx 'Malformed request.' errors
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 401 Response
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 403 Response
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 409 Response
'429':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 429 Response
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
AServerErrorOccurred.:
value:
errors:
- status: 500
code: error
title: APIException
detail: A server error occurred.
source: null
meta:
source: ZAPIER
full_details:
message: A server error occurred.
code: error
summary: A server error occurred.
description: >-
This schema can be expected for 5xx 'A server error occurred.'
errors
'503':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 503 Response
'504':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 504 Response
security:
- ClientIDAuthentication: []
components:
schemas:
ErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/Error'
description: An array of error objects.
required:
- errors
Error:
type: object
description: Base Error definition
properties:
status:
type: integer
description: The HTTP status code applicable to this problem.
code:
type: string
description: A unique identifier for this particular occurrence of the problem.
title:
type: string
description: A short summary of the problem.
detail:
type: string
description: >-
A human-readable explanation specific to this occurrence of the
problem.
source:
oneOf:
- $ref: '#/components/schemas/ErrorSource'
- type: 'null'
description: An object containing references to the primary source of the error.
meta:
type:
- object
- 'null'
additionalProperties: {}
description: Freeform metadata about the error
ErrorSource:
type: object
description: Populates the `source` object inside our error responses.
properties:
pointer:
type: string
description: >-
Pointer to the value in the request document that caused the error
e.g. `/actions`.
parameter:
type: string
description: A string indicating which URI query parameter caused the error.
header:
type: string
description: >-
A string indicating the name of a single request header which caused
the error.
securitySchemes:
ClientIDAuthentication:
type: apiKey
in: query
name: client_id
description: See our authentication documentation for how to find your Client ID
x-zapier-auth-scheme-exempt: true
````
---
# Source: https://docs.zapier.com/powered-by-zapier/running-actions/create-action-run.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Creating Action Runs
## Prerequisites
Before you begin, make sure:
* You have access to a **public Zapier integration**.
* You’ve [registered your app and authenticated](/powered-by-zapier/authentication/methods/user-access-token) to use the API.
* You have at least one **action** configured in your integration, with required fields and sample data tested in the Zapier UI or via the API.
***
To trigger an action, make a `POST` request to [/v2/action-runs/](/powered-by-zapier/api-reference/actions/create-an-action-run)
**Important:** Before every action run, for the `action` attribute on your request body you should retreive a new/unique `id` from the [Get Actions](/powered-by-zapier/api-reference/actions/get-actions) endpoint for the action that you'd like to execute. This ensures that the action run can be uniquely tracked, that it can be properly debugged, and that attributions are properly reported.
**Note:** *The `id` attribute will be unique for every lookup on the [Get Actions](/powered-by-zapier/api-reference/actions/get-actions) endpoint, and the `key` attribute will be the action's consistent developer-provided identifier.*
### Request Example
```http theme={null}
POST https://api.zapier.com/v2/action-runs/
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
{
"action": "core:89sg4uhs5g85gh53hso59hs399hgs59",
"authentication": "UHsi8e6K",
"input": {
"email": "user@example.com",
"message": "Hello from Powered by Zapier!"
}
}
```
### Parameters
| Field | Type | Description |
| ---------------- | ------ | ------------------------------------------------------- |
| `action` | string | The unique identifier of the action you want to run. |
| `authentication` | string | The authentication id needed to run this action. |
| `input` | object | Key-value pairs of input fields required by the action. |
### Response Example
```json theme={null}
{
"data": {
"type": "run",
"id": "arun_abc123"
}
}
```
You can use this run's `id` to poll for the run’s status and result.
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/actions/create-an-action-run.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create an Action Run
> Runs an action (step) in the third party API, using the provided authentication and inputs.
This endpoint is asynchronous, and the response will contain an Action Run ID. You can use the `/v2/action-runs/:id` endpoint to check the status of the run and retrieve the results.
#### When using OAuth
This endpoint requires the `action:run` OAuth scope.
Running actions via the Workflow API is currently in limited beta. If you
would like access to run actions, please use [this
form](https://zapier.com/developer-platform#form) to request access.
This API is [rate limited](/powered-by-zapier/api-reference/rate-limiting).
## OpenAPI
````yaml https://api.zapier.com/schema post /v2/action-runs
openapi: 3.1.0
info:
title: Partner API
version: 2024.11.0
description: >
## Introduction
The Partner API is the best tool for complete style control over a user's
Zapier experience within your app.
Essentially, it lets you customize how you present Zapier within your
product without sacrificing your app's look,
feel, and flow.
Think of it as a native Zapier integration, helping you showcase your best
Zapier-powered workflows where it's most
helpful to your users (within the flow of your tool). You can customize
styling, streamline Zap set-up for users,
expose relevant Zap information, and more!
With the Partner API, you can:
- Get a list of all the apps available in Zapier's app directory so you can
power your app directory and show your
users all the integration possibilities with your Zapier integration.
- Have complete style control over how you present Zap templates in your
product. The Partner API gives you access
to the raw Zap Template data so you can give your users access to your Zap
template with your product's style, look
and feel.
- Get access to all your Zap templates and give your users the ability to
search to quickly find the one they need.
- Streamline Zap setup by pre-filling fields on behalf of your users.
- Show users the Zaps they have set up from right within your product
keeping them on your site longer and giving them
complete confidence in their Zapier integration.
- Embed our Zapier Editor to allow your users to create new Zaps and modify
existing ones, without needing to leave
your product.
## Authentication
There are two ways to authenticate with the Partner API.
1. Your application's `client_id` which you will receive once you are
approved for access to the API
(Client ID Authentication)
2. A user's access token (Access Token Authentication).
Which authentication method you should use depends on which endpoint(s) you
are using.
Review each endpoint's documentation to understand which parameters are
required.
> Note: while we do generate a `client_secret`, the type of grant we use
(implicit) doesn't
need it so it's not something we provide.'
## Learn more
See the [Workflow API
documentation](https://docs.zapier.com/partner-solutions/workflow-api/intro)
for more information.
contact:
name: Zapier
url: https://developer.zapier.com/contact
servers:
- url: https://api.zapier.com
security: []
tags:
- name: Accounts
description: Refers to resources interacting with 'Accounts' associated resources
- name: Actions
description: Refers to resources interacting with 'Actions' associated resources
- name: Apps
description: Refers to resources interacting with 'Apps' associated resources
- name: Authentications
description: >-
Refers to resources interacting with 'Authentications' associated
resources
- name: Categories
description: Refers to resources interacting with 'Categories' associated resources
- name: Experimental
description: Refers to resources interacting with 'Experimental' associated resources
- name: Inputs
description: Refers to resources interacting with 'Inputs' associated resources
- name: Outputs
description: Refers to resources interacting with 'Outputs' associated resources
- name: Zaps
description: Refers to resources interacting with 'Zaps' associated resources
- name: Zap Templates
description: Refers to resources interacting with 'Zap Templates' associated resources
paths:
/v2/action-runs:
post:
tags:
- Experimental
summary: Create an Action Run
description: >-
Runs an action (step) in the third party API, using the provided
authentication and inputs.
This endpoint is asynchronous, and the response will contain an Action
Run ID. You can use the `/v2/action-runs/:id` endpoint to check the
status of the run and retrieve the results.
#### When using OAuth
This endpoint requires the `action:run` OAuth scope.
operationId: create-action-run
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/RunActionRequest'
examples:
CreatingAnActionRun(runningAnAction):
value:
data:
action: example_core:Vn7xbE60
authentication: example_QVaAreV1
inputs:
email: me@example.com
summary: Creating an Action Run (running an action)
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/RunActionResponse'
examples:
CreateActionRunResponse:
value:
data:
type: run
id: 123e4567-e89b-12d3-a456-426614174000
summary: Create Action Run Response
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
MalformedRequest.:
value:
errors:
- status: 400
code: parse_error
title: ParseError
detail: Malformed request.
source: null
meta:
source: ZAPIER
full_details:
message: Malformed request.
code: parse_error
summary: Malformed request.
description: This schema can be expected for 4xx 'Malformed request.' errors
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 401 Response
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 403 Response
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 409 Response
'429':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 429 Response
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
AServerErrorOccurred.:
value:
errors:
- status: 500
code: error
title: APIException
detail: A server error occurred.
source: null
meta:
source: ZAPIER
full_details:
message: A server error occurred.
code: error
summary: A server error occurred.
description: >-
This schema can be expected for 5xx 'A server error occurred.'
errors
'503':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 503 Response
'504':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 504 Response
security:
- OAuth:
- action:run
components:
schemas:
RunActionRequest:
type: object
properties:
data:
allOf:
- $ref: '#/components/schemas/_RunActionRequest'
description: Data for the Action Run
required:
- data
RunActionResponse:
type: object
properties:
data:
$ref: '#/components/schemas/_RunActionResponse'
required:
- data
ErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/Error'
description: An array of error objects.
required:
- errors
_RunActionRequest:
type: object
properties:
action:
type: string
description: The ID for the Action to be run
authentication:
type:
- string
- 'null'
description: The ID for Authentication (if required)
inputs:
type: object
additionalProperties: {}
description: >-
Inputs to be provided to the Action referenced by the ID field, when
run
required:
- action
- authentication
- inputs
_RunActionResponse:
type: object
description: The response after an Action Run
properties:
type:
allOf:
- $ref: '#/components/schemas/RunTypeEnum'
description: |-
The type of this object
* `run` - Run
id:
type: string
format: uuid
description: The UUID of this Action Run
required:
- id
- type
Error:
type: object
description: Base Error definition
properties:
status:
type: integer
description: The HTTP status code applicable to this problem.
code:
type: string
description: A unique identifier for this particular occurrence of the problem.
title:
type: string
description: A short summary of the problem.
detail:
type: string
description: >-
A human-readable explanation specific to this occurrence of the
problem.
source:
oneOf:
- $ref: '#/components/schemas/ErrorSource'
- type: 'null'
description: An object containing references to the primary source of the error.
meta:
type:
- object
- 'null'
additionalProperties: {}
description: Freeform metadata about the error
RunTypeEnum:
enum:
- run
type: string
description: '* `run` - Run'
ErrorSource:
type: object
description: Populates the `source` object inside our error responses.
properties:
pointer:
type: string
description: >-
Pointer to the value in the request document that caused the error
e.g. `/actions`.
parameter:
type: string
description: A string indicating which URI query parameter caused the error.
header:
type: string
description: >-
A string indicating the name of a single request header which caused
the error.
securitySchemes:
OAuth:
type: oauth2
description: >-
See our OAuth2 authentication documentation here:
https://docs.zapier.com/powered-by-zapier/api-reference/authentication
flows:
authorizationCode:
authorizationUrl: https://zapier.com/oauth/authorize/
tokenUrl: https://zapier.com/oauth/token/
refreshUrl: https://zapier.com/oauth/token/
scopes:
profile: Read profile information about the currently-authenticated user
zap: Read Zaps
zap:write: Write Zaps
authentication: Read Authentications
authentication:write: Write Authentications
zap:runs: Read Zap Runs
action:run: Run an Action
zap:all: Read Zaps accessible to the account
implicit:
authorizationUrl: https://zapier.com/oauth/authorize/
scopes:
profile: Read profile information about the currently-authenticated user
zap: Read Zaps
zap:write: Write Zaps
authentication: Read Authentications
authentication:write: Write Authentications
zap:runs: Read Zap Runs
action:run: Run an Action
zap:all: Read Zaps accessible to the account
````
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/authentications/create-authentication.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create Authentication
> Creates a new Authentication for the provided App. See our Adding an Authentication guide to get started.
#### When using OAuth
This endpoint requires the `authentication:write` OAuth scope.
This API is [rate limited](/powered-by-zapier/api-reference/rate-limiting).
## OpenAPI
````yaml https://api.zapier.com/schema post /v2/authentications
openapi: 3.1.0
info:
title: Partner API
version: 2024.11.0
description: >
## Introduction
The Partner API is the best tool for complete style control over a user's
Zapier experience within your app.
Essentially, it lets you customize how you present Zapier within your
product without sacrificing your app's look,
feel, and flow.
Think of it as a native Zapier integration, helping you showcase your best
Zapier-powered workflows where it's most
helpful to your users (within the flow of your tool). You can customize
styling, streamline Zap set-up for users,
expose relevant Zap information, and more!
With the Partner API, you can:
- Get a list of all the apps available in Zapier's app directory so you can
power your app directory and show your
users all the integration possibilities with your Zapier integration.
- Have complete style control over how you present Zap templates in your
product. The Partner API gives you access
to the raw Zap Template data so you can give your users access to your Zap
template with your product's style, look
and feel.
- Get access to all your Zap templates and give your users the ability to
search to quickly find the one they need.
- Streamline Zap setup by pre-filling fields on behalf of your users.
- Show users the Zaps they have set up from right within your product
keeping them on your site longer and giving them
complete confidence in their Zapier integration.
- Embed our Zapier Editor to allow your users to create new Zaps and modify
existing ones, without needing to leave
your product.
## Authentication
There are two ways to authenticate with the Partner API.
1. Your application's `client_id` which you will receive once you are
approved for access to the API
(Client ID Authentication)
2. A user's access token (Access Token Authentication).
Which authentication method you should use depends on which endpoint(s) you
are using.
Review each endpoint's documentation to understand which parameters are
required.
> Note: while we do generate a `client_secret`, the type of grant we use
(implicit) doesn't
need it so it's not something we provide.'
## Learn more
See the [Workflow API
documentation](https://docs.zapier.com/partner-solutions/workflow-api/intro)
for more information.
contact:
name: Zapier
url: https://developer.zapier.com/contact
servers:
- url: https://api.zapier.com
security: []
tags:
- name: Accounts
description: Refers to resources interacting with 'Accounts' associated resources
- name: Actions
description: Refers to resources interacting with 'Actions' associated resources
- name: Apps
description: Refers to resources interacting with 'Apps' associated resources
- name: Authentications
description: >-
Refers to resources interacting with 'Authentications' associated
resources
- name: Categories
description: Refers to resources interacting with 'Categories' associated resources
- name: Experimental
description: Refers to resources interacting with 'Experimental' associated resources
- name: Inputs
description: Refers to resources interacting with 'Inputs' associated resources
- name: Outputs
description: Refers to resources interacting with 'Outputs' associated resources
- name: Zaps
description: Refers to resources interacting with 'Zaps' associated resources
- name: Zap Templates
description: Refers to resources interacting with 'Zap Templates' associated resources
paths:
/v2/authentications:
post:
tags:
- Authentications
summary: Create Authentication
description: >-
Creates a new Authentication for the provided App. See our Adding an
Authentication guide to get started.
#### When using OAuth
This endpoint requires the `authentication:write` OAuth scope.
operationId: create-authentication
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/AuthenticationCreateRequest'
examples:
NewAuthentication:
value:
data:
title: My new auth
app: 8cdbc496-c95c-4f19-b3a3-fee03ed5f924
authentication_fields:
secret: example_E4CrHVvRuxTXrPFLyyZFeRJwJcx2ELQZ
summary: New Authentication
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/AuthenticationResponse'
examples:
CreatedAuth:
value:
links:
next: null
prev: null
meta:
count: 1
limit: 1
offset: 0
data:
- type: authentication
id: example_DOb4nWkz
app: a8aaed31-e257-4479-aaa9-ca02fe2fab04
is_expired: false
title: 'Example zapier@example.com #5'
summary: Created Auth
description: ''
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
MalformedRequest.:
value:
errors:
- status: 400
code: parse_error
title: ParseError
detail: Malformed request.
source: null
meta:
source: ZAPIER
full_details:
message: Malformed request.
code: parse_error
summary: Malformed request.
description: This schema can be expected for 4xx 'Malformed request.' errors
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 401 Response
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 403 Response
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 409 Response
'429':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 429 Response
'500':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
AServerErrorOccurred.:
value:
errors:
- status: 500
code: error
title: APIException
detail: A server error occurred.
source: null
meta:
source: ZAPIER
full_details:
message: A server error occurred.
code: error
summary: A server error occurred.
description: >-
This schema can be expected for 5xx 'A server error occurred.'
errors
'503':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 503 Response
'504':
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: 504 Response
security:
- OAuth:
- authentication:write
components:
schemas:
AuthenticationCreateRequest:
type: object
description: Inputs to create a new Authentication
properties:
data:
$ref: '#/components/schemas/_AuthenticationCreateRequest'
required:
- data
AuthenticationResponse:
type: object
description: |-
Base Response definition to be used in other Response Serializers.
Be sure to include the `data` field after using this class
properties:
links:
allOf:
- $ref: '#/components/schemas/Links'
description: The links object returned in paginated response bodies.
meta:
allOf:
- $ref: '#/components/schemas/BaseMeta'
description: The meta object returned in paginated response bodies.
data:
type: array
items:
$ref: '#/components/schemas/Authentication'
description: The Authentications present, provided they exist
required:
- links
- meta
ErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/Error'
description: An array of error objects.
required:
- errors
_AuthenticationCreateRequest:
type: object
description: The object used to create a new Authentication
properties:
title:
type: string
description: The title of the authentication.
maxLength: 255
app:
type: string
format: uuid
description: A canonical App ID, as provided by the `/apps` endpoint.
authentication_fields:
type: object
additionalProperties: {}
description: >-
Required values to create an authentication. These values will be
used by the target integration to successfully create the
Authentication. See our Adding an Authentication guide for more
information.
required:
- app
- authentication_fields
- title
Links:
type: object
description: The links object returned in paginated response bodies.
properties:
next:
type:
- string
- 'null'
description: The URL of the next page of paginated results.
prev:
type:
- string
- 'null'
description: The URL of the previous page of paginated results.
BaseMeta:
type: object
description: The meta object returned in paginated response bodies.
properties:
count:
type: integer
minimum: 0
description: >-
The total number of objects in the collection represented by the
endpoint.
limit:
type:
- integer
- 'null'
minimum: 1
description: The limit value used in the request.
offset:
type: integer
minimum: 0
default: 0
description: The offset value used in the request.
required:
- count
- limit
Authentication:
type: object
description: >-
An Authentication contains various fields, often credentials such as API
tokens, used to access Partner APIs on
behalf of a user. The actual fields are held securely by Zapier
properties:
type:
allOf:
- $ref: '#/components/schemas/AuthenticationTypeEnum'
readOnly: true
default: authentication
description: |-
The type of this object.
* `authentication` - authentication
id:
type: string
description: The identifier for this specific Authentication
app:
description: An app that integrates with Zapier.
oneOf:
- $ref: '#/components/schemas/Apps'
- type: string
is_expired:
type: boolean
description: >-
If `true`, this Authentication has expired. It will not be usable,
and the user needs to be directed to reconnect it.
title:
type: string
description: The title of this specific Authentication
required:
- app
- id
- is_expired
- title
- type
Error:
type: object
description: Base Error definition
properties:
status:
type: integer
description: The HTTP status code applicable to this problem.
code:
type: string
description: A unique identifier for this particular occurrence of the problem.
title:
type: string
description: A short summary of the problem.
detail:
type: string
description: >-
A human-readable explanation specific to this occurrence of the
problem.
source:
oneOf:
- $ref: '#/components/schemas/ErrorSource'
- type: 'null'
description: An object containing references to the primary source of the error.
meta:
type:
- object
- 'null'
additionalProperties: {}
description: Freeform metadata about the error
AuthenticationTypeEnum:
enum:
- authentication
type: string
description: '* `authentication` - authentication'
Apps:
type: object
description: An app that integrates with Zapier
properties:
id:
type: string
description: Unique id of the app
type:
type: string
default: app
description: The type of this object.
image:
type: string
description: Default image/icon to represent the app.
links:
type: object
additionalProperties: {}
description: >-
A url that, when visited, will direct the user to authenticate with
the app and allow Zapier access to the app, thus creating a new
Authentication.
If value is `null`, then no authentication is required to use the app. Client ID-authenticated requests will never have this object's fields populated.
action_types:
type: array
items: {}
description: A list of action types for this specific App
title:
type: string
description: Human readable name of the app
images:
allOf:
- $ref: '#/components/schemas/AppsImages'
description: The URL of images (of various sizes) for this specific App
hex_color:
type: string
description: A branded color that can be used to represent the app.
categories:
type: array
items:
$ref: '#/components/schemas/Category'
description: >-
A list of categories to which this app belongs. Helpful in
identifying apps by type and functionality.
description:
type: string
description: Human readable description of the app.
required:
- action_types
- categories
- description
- hex_color
- id
- image
- images
- links
- title
ErrorSource:
type: object
description: Populates the `source` object inside our error responses.
properties:
pointer:
type: string
description: >-
Pointer to the value in the request document that caused the error
e.g. `/actions`.
parameter:
type: string
description: A string indicating which URI query parameter caused the error.
header:
type: string
description: >-
A string indicating the name of a single request header which caused
the error.
AppsImages:
type: object
description: Images/icons of various resolutions to represent the app.
properties:
url_16x16:
type: string
description: 16x16 resolution image URL
url_32x32:
type: string
description: 32x32 resolution image URL
url_64x64:
type: string
description: 64x64 resolution image URL
url_128x128:
type: string
description: 128x128 resolution image URL
required:
- url_128x128
- url_16x16
- url_32x32
- url_64x64
Category:
type: object
description: Category an app belongs to.
properties:
slug:
type: string
description: The shortened slug name for this category
required:
- slug
securitySchemes:
OAuth:
type: oauth2
description: >-
See our OAuth2 authentication documentation here:
https://docs.zapier.com/powered-by-zapier/api-reference/authentication
flows:
authorizationCode:
authorizationUrl: https://zapier.com/oauth/authorize/
tokenUrl: https://zapier.com/oauth/token/
refreshUrl: https://zapier.com/oauth/token/
scopes:
profile: Read profile information about the currently-authenticated user
zap: Read Zaps
zap:write: Write Zaps
authentication: Read Authentications
authentication:write: Write Authentications
zap:runs: Read Zap Runs
action:run: Run an Action
zap:all: Read Zaps accessible to the account
implicit:
authorizationUrl: https://zapier.com/oauth/authorize/
scopes:
profile: Read profile information about the currently-authenticated user
zap: Read Zaps
zap:write: Write Zaps
authentication: Read Authentications
authentication:write: Write Authentications
zap:runs: Read Zap Runs
action:run: Run an Action
zap:all: Read Zaps accessible to the account
````
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/promotions/create-enrollment.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Create Promotion Enrollment
> Enrolls an account into an existing promotion.
Endpoint available to Partners only.
The request must be authenticated by an [access token](https://docs.zapier.com/powered-by-zapier/api-reference/authentication#retrieving-a-user-access-token)
that the user has granted to the Partner for the account.
The `enrollment_id`, returned after successfully enrolling a user,
**must** be stored by the partner in order to [retrieve](https://docs.zapier.com/powered-by-zapier/api-reference/promotions/get-enrollment)
or [delete](https://docs.zapier.com/powered-by-zapier/api-reference/promotions/delete-enrollment) the enrollment.
#### OAuth
This endpoint requires the `promotions:write` OAuth scope.
This API is [rate limited](/powered-by-zapier/api-reference/rate-limiting).
## OpenAPI
````yaml powered-by-zapier/api-reference/promotions-openapi.yaml post /v2/promotions
openapi: 3.1.0
info:
title: Powered by Zapier Promotions API
version: promotions
description: >-
The API to define promotions, powered by Zapier. See
https://docs.zapier.com/powered-by-zapier/introduction for more information.
contact:
name: Partner Sharing
servers:
- url: https://api.zapier.com
description: Production
security: []
tags:
- name: Promotions
description: Operations related to managing Promotions
- name: Experimental
description: >-
Operations that are not to be considered finalized, and are subject to
change
paths:
/v2/promotions:
post:
tags:
- Promotions
- Experimental
summary: Create a promotion enrollment
description: >-
Enrolls an account into an existing promotion.
Endpoint available to Partners only.
The request must be authenticated by an [access
token](https://docs.zapier.com/powered-by-zapier/api-reference/authentication#retrieving-a-user-access-token)
that the user has granted to the Partner for the account.
The `enrollment_id`, returned after successfully enrolling a user,
**must** be stored by the partner in order to
[retrieve](https://docs.zapier.com/powered-by-zapier/api-reference/promotions/get-enrollment)
or
[delete](https://docs.zapier.com/powered-by-zapier/api-reference/promotions/delete-enrollment)
the enrollment.
#### OAuth
This endpoint requires the `promotions:write` OAuth scope.
operationId: root_create
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionEnrollment'
examples:
EnrollInAPromotion:
value:
promotion_id: promo_12345
summary: Enroll in a promotion
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionEnrollmentResponse'
description: Successful Enrollment
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
Access:
value:
errors:
- status: '401'
code: not_authenticated
title: User Not Authenticated
detail: >-
User must be authenticated to access this resource. No
valid user access token was provided.
description: >-
Access denied: User does not have permission for enrollment_id:
enroll_67890
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
Forbidden:
value:
errors:
- status: '403'
code: permission_denied
title: Permission Denied
detail: You do not have permission to perform this action.
description: Forbidden - User lacks permission to access this location
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
'404':
value:
errors:
- status: '404'
code: promotion_not_found
title: Promotion Not Found
detail: >-
The requested promotion was not found. The specified
promotion_id may be invalid.
description: 404 Not Found
'409':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
Conflict:
value:
errors:
- status: '409'
code: already_enrolled
title: Already Enrolled
detail: >-
The provided account is already enrolled in the
specified promotion.
description: Conflict - User is already enrolled in this promotion
'429':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
description: ''
'503':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
description: ''
security:
- OAuth:
- promotions:write
components:
schemas:
PromotionEnrollment:
type: object
properties:
promotion_id:
type: string
description: The unique identifier for the promotions
required:
- promotion_id
PromotionEnrollmentResponse:
type: object
description: Successful Enrollment
properties:
enrollment_id:
type: string
description: >-
The unique identifier for the enrollment. This must be stored by
partners.
required:
- enrollment_id
PromotionErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/PromotionError'
description: Errors encountered processing the request
required:
- errors
PromotionError:
type: object
properties:
status:
type: string
description: HTTP status code of the error
code:
type: string
description: Machine-readable error code
title:
type: string
description: Human-readable error title
detail:
type: string
description: Detailed description of the error
required:
- code
- detail
- status
- title
securitySchemes:
OAuth:
type: oauth2
description: >-
The user access token for the user you would like to enroll. See our
[OAuth2 authentication
documentation](https://docs.zapier.com/powered-by-zapier/api-reference/authentication#retrieving-a-user-access-token).
flows:
authorizationCode:
authorizationUrl: https://zapier.com/oauth/authorize/
tokenUrl: https://zapier.com/oauth/token/
refreshUrl: https://zapier.com/oauth/token/
scopes:
promotions:write: Enroll or unenroll accounts into promotions
promotions:read: View usage of promotions you manage on an account
clientCredentials:
tokenUrl: /oauth/token
scopes:
promotions:write: Unenroll accounts from promotions
````
---
# Source: https://docs.zapier.com/platform/build/create.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add a create action
## 1. Add the action settings
* Open the *Actions* tab in Zapier's Platform UI from the sidebar on the left, and select **Add Action**, selecting your action type. New actions are *create* type by default, and they add new data or update existing data to your app.
**Note**: You cannot change an action type once you click *Save and Continue*
on a new action. If you need to change the action type, delete the action and
recreate it.
* On the Settings page, specify the following:
– **Key**: A unique identifier for this action, used to reference the action inside Zapier. Does not need to be the same identifier as used in your API. Not shown to users.
– **Name**: A human friendly plain text name for this action, typically with a verb such as *Add* or *Create* followed by the name of the item this action will create in your app. The title-case name is shown inside the Zap editor and on Zapier's app directory marketing pages.
– **Noun**: A single noun that describes what this action creates, used by Zapier to auto-generate text in Zaps about your action.
– **Description**: A plain text sentence that describes what the action does and when it should be used. Shown inside the Zap editor and on Zapier's app directory marketing pages. Starts with the phrase “Creates a new”.
– **Visibility Options**: An option to select when this action will be shown. *Shown* is chosen by default. Choose `Hidden` if this action should not be shown to users. `Hidden` is usually selected if you build a *create* action solely to [pair with a search action](/platform/build/search-or-create) but do not want it used on its own.
* Click on the *Save and Continue* button.
## 2. Complete the Input Designer
On the *Input Designer* page, add user [input fields](/platform/build/add-fields) for this action. All action steps *must* include an input form for Zapier to gather the data needed to create or find items in your app. Add at least one input field to your action.
Before building your action's input form, list each piece of data your app needs to create a new item. For example, if building an action to send an email, fields for the email address, subject, and email body would be needed. Your action will likely have several required fields, along with others that are optional, such as for tags or other details.
Add action fields for each piece of data your app needs to create or find this item in your app. Add the fields in the order they're listed in your app, with *required* fields first, for the best user experience.
## 3. Set up the API Configuration
The final page of building your action tells Zapier how to send the data to your API.
A `POST` call populates for *create* actions by default, sending a single item to the provided API endpoint. Zapier then expects a response with an object containing a single item, to be evaluated by [isPlainObject](https://lodash.com/docs#isPlainObject) and parsed into individual fields for use in subsequent Zap steps.
Select the correct API call if your app expects something other than the default, then paste the URL for your API call in the box under *API Endpoint*. Zapier will include each of your input form fields in the *Request Body* automatically.
If your API call expects input data in the core URL, reference any input field's key with the following text, replacing `key` with your field key:
`{{bundle.inputData.key}}`
The defaults on all other settings work for most basic API calls. If you need to configure more options, click *Show Options* to add URL Params, HTTP Headers, set your action to omit empty parameters, or customize the request body. Alternately, switch to [Code Mode](/platform/build/code-mode) to write custom JavaScript code for your action.
## 4. Test your API request
Configure test data to [test the *create* action](/platform/build/test-triggers-actions). Note that testing a POST or PUT request will create or update the item in your app.
## 5. Define your output
Define sample data and output fields following [the guide](/platform/build/sample-data).
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/reference/crm-app.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Zapier integration structure for a CRM app
> CRM (customer relationship management) apps are detailed databases that link contacts with companies, companies with deals, and more.
To add a CRM app integration in the Platform UI:
## Prerequisites
* A [Zapier account](https://zapier.com/sign-up).
* If you haven't used Zapier before, you'll want to learn the basics in our [Zapier Getting Started Guide](https://zapier.com/learn/zapier-quick-start-guide/).
* Familiarity with your app's API documentation and available endpoints.
* Review the [Platform UI Tutorial](/platform/quickstart/ui-tutorial).
## 1. Add triggers for common record types in the CRM
* Check out the [common record types](/platform/quickstart/must-have-triggers-and-actions#crm-customer-relationship-management) used as triggers by other CRM apps.
* Build separate triggers for new and updated records. *Updated* triggers for CRMs are most useful when users are able to specify which field(s) to watch for updates on, instead of triggering on any and all updates.
* Include filter options if your app lets users add custom filters or views. Displaying an optional [dynamic dropdown](/platform/build/field-definitions#dynamic-dropdown) of the user's filters and ordering them by the most recently added is best practice.
## 2. Choose trigger type under API Configuration
### REST Hook trigger
* If your app supports webhook subscriptions that can be manipulated through a REST API, use [REST hooks](/platform/build/trigger#rest-hook-trigger) for your trigger to send new records to Zapier as soon as they are added to the CRM.
* Webhook triggers are marked as *Instant* [in the Zap Editor](https://cdn.zappy.app/6b696dfaf34664b181b6df651067cfd3.png).
* When your user has many app records created in a short space of time, webhooks make your integration more robust, preventing the possibility that a high number of new records will exceed the page size of polling results.
* With REST hooks, Zapier won't need to repeatedly poll your API to check for new responses.
### Polling trigger
* When using a Polling trigger, and for the *Perform List* URL for REST Hook triggers, the Polling URL should return the most recent record created or updated (if the trigger is an ‘Updated Record' trigger)
* If there are no recent new records, return an empty array. Zapier will then encourage the user to create a sample and re-test their trigger in the Zap Editor to finish mapping their Zap.
## 3. Additional considerations for Updated Record triggers
* Users expect updated triggers to run whenever a record has new data added, or when relational data is added or removed.
* For REST hook triggers, ensure that when relational data is reapplied to a record, your app sends Zapier that updated record.
* For polling triggers, to account for [deduplication](/platform/build/deduplication), you will need to customize your API call's code to ensure each record has a unique primary key (usually an `id` field). This could mean [copying a unqiue timestamp](/platform/build/deduplication#custom-primary-keys) to the `id` field or [setting `primary` to true](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#how-does-deduplication-work) for some output fields.
### Include linked information in trigger response
* CRM records are one part of a linked ecosystem of data. For example, if your trigger is “New Contact” and newly added contacts are linked to organizations, users expect to see full organization data, too.
* Include both IDs for linked data in the response output so they can be mapped to your app's action steps, as well as human-readable data such as individual fields for their name and contact info.
* If your record API endpoint does not automatically return additional linked data beyond the ID or name of the record, add custom code to your trigger API call to fetch relevant data linked to the record as well.
### Handle custom fields
* Use \[pagination]\((/platform/build/trigger#how-to-use-pagination) to retrieve custom fields a user might expect.
### Handle tags
* Return tags on records as either an array of strings or a comma-delimited list in a single string, for users to be be able to easily map them into other app actions.
## 4. Include common search actions
* Users expect to have searches for common records available for CRM integrations and for those searches to have parity with the fields returned for those same record triggers. For example, a user might have a *New Contact* trigger, and then want to find out more information about the organization the contact is associated with by using a *Find Organization* search. If the *New Contact* trigger only provides the associated organization ID, it doesn't make sense for the *Find Organization* search to only allow searches for the organization name.
* Configure the search to find an existing record, returning it in the same format the trigger returns records to give a consistent experience and allow the data to be used in the same manner in later actions.
* Offer multiple search key and value options where applicable.
* Prevent deduplication problems for unique fields (such as email) though, by offering only a single search query for that field instead of multiple options. This prevents users from searching on a different field, trying to create a new record, and seeing an error that a record with that email already exists.
* If a record cannot be found, do not return an error. Instead return a `200` success response with an empty array. That way, users can pair the search with a *Create* action to let users search for records and create them if they don't exist. Users will see a halted exception instead of an error.
\_ Read more about pairing [searches and creates](/platform/build/search-or-create).
## 5. Include common create actions
* Check out the [common record types](/platform/quickstart/must-have-triggers-and-actions#crm-customer-relationship-management) other CRM apps have create actions for.
* Use the standard *Create* or *Add* naming pattern to show users that this action creates a new record in your app
* Add corresponding *Update* actions with available *Search* actions to make it easier for users to update the correct record.
* Account for linked records in action input fields, so when your app's UI allows users to create a contact and link it to existing companies or stages, the same action is available through Zapier, via a [dynamic dropdown](/platform/build/field-definitions#dynamic-dropdown) to fetch linked record options and let users select them.
* Optionally link a [search connector](https://cdn.zappy.app/103626b1313602fa33c33711ed44ff56.png) to linked record input fields if users need to have the Zap find the correct related record, and map the found ID to the input field. To add that user prompt you'll need to work in the [Platform CLI](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#search-powered-fields).
* Do not have a single action create multiple records. When a user creates a new contact through Zapier, this should only create new contacts, and should not also create other linked records at the same time. Rather include a separate action to create the other linked record, along with a contact update action to link the contact after the other record is created. This reduces the chance for errors and record redundancy.
* Account for [custom fields in action input fields](/platform/build/dynamic-field), displaying the human-readable label instead of the internal ID.
* The first version of your integration doesn't need to have every possible action available, but add compatible functionality users expect or request in future updates.
## 6. Support in-app workflows
* If new records created in your app get automatically added to in-app workflows, sequences, follow-ups, or campaigns, make sure records created via the API by Zaps will also get automatically added to workflows.
* Optionally add a boolean field to your action input fields to let users select if they want this contact added to a workflow, or include a [dynamic dropdown](/platform/build/field-definitions#dynamic-dropdown) to select the workflow they want.
## 7. Test your triggers and actions
Make Zaps with the following criteria to ensure your app integration works as expected:
* Add a record in your app with many custom fields, and create a Zap to watch for new records to make sure each field is included when it triggers and is mappable in subsequent steps
* Create a multi-step Zap with at least one trigger, search, and action step where every step uses your app integration, to check the ease of linking one step to another.
* If you've included the option to link records in your integration's actions, verify these are linked correctly when creating records via a Zap.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/reference/custom-actions-api-requests.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Custom actions and API requests actions
> [Custom Actions](https://help.zapier.com/hc/en-us/articles/16276574838925-App-Extensions-in-Zapier) and [API Requests](https://help.zapier.com/hc/en-us/articles/12899607716493-Set-up-an-API-request-action#prerequisites-0-0) are features that have been developed internally at Zapier, designed to help our mutual customers achieve the most value out of your app integration.
## What are Custom Actions and API Requests?
Custom Actions and API Requests enable Zapier users to build raw API requests with public APIs while leveraging your app integration's existing authentication protocol.
Since the launch, we've seen that the feature has been embraced and users are increasingly building and testing Custom Actions and API Requests. As customers build these requests, they may experience certain challenges with them – issues related to client permissions, malformed API URLs, or bad requests, for instance. These challenges, however, are neither unique nor unexpected, as they occur consistently in other similar settings like Zapier's built-in [Webhooks functionality](https://help.zapier.com/hc/en-us/sections/16074864820109-Webhooks-Code).
The Zapier support team stands ready to help users understand the feature and ensure it works as anticipated. However, it is essential for the user to correct and resolve the API error themselves, which is analogous to Zapier's support policy for Webhooks. This empowers users to receive the best experience from the platform while strengthening their skills.
## Can I enable Custom Actions and API Requests for my integration if it's not currently enabled?
As of July 1, 2024, we are not supporting Custom Actions or API Requests for new integrations. However, we are committed to enhancing the experience for all users. If you are interested in enabling Custom Actions or API Requests for your integration, we encourage you to contact our Platform Support Team via our [contact form](https://developer.zapier.com/contact). Your feedback is invaluable and helps us understand the significance of this feature for our partners.
## Can I opt-out of Custom Actions and API Requests if it's already enabled?
We currently aren't supporting an opt-out initiative. However, we are committed to bettering experiences for every user and encourage you to voice your concerns or feedback regarding this feature. Should you continue to experience any challenges or have specific pain points you're encountering, we would be glad to work on those to improve your experience.
We understand that you may have apprehensions regarding the potential support load, especially with respect to users building their own API requests. Be assured, we are dedicated to helping alleviate any impacts that this may cause. The primary goal is to empower users with more control over their API requests, presenting them with a richer experience and a superior level of customization. We believe our users derive significant value from these direct API requests.
Do not hesitate to reach out with more questions and feedback via our [contact form](https://developer.zapier.com/contact). We are always open to dialogue aimed at improving our services and our working relationship with our partners.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/deduplication.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# How deduplication works in Zapier
> Zapier automatically deduplicates incoming trigger data for your integration, so that Zaps do not run multiple times on the same data. Consider the following requirements for your “New Item” and “Updated Item” triggers to work as users expect.
* Provide a unique primary key.
* By default, the field with the key `id` is used as the primary key.
* Alternatively, if you're using the CLI, you can choose other fields as the primary key by enabling `primary` in `outputFields`. See [more information](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#how-does-deduplication-work) in the CLI docs.
* Sort reverse-chronologically by time created.
The API endpoint must list new or updated items in an array sorted in reverse chronological order.
[Polling](/platform/build/trigger) usually returns many results, most of which Zapier has seen before. Since a Zap should not trigger multiple times when an item in your app exists in multiple distinct polls, the data must be deduplicated.
For example, say your endpoint for new items returns a list of tasks:
```json theme={null}
[
{
"id": 7,
"created": "Mon, 25 Jun 2023 16:41:54 -0400",
"list_id": 1,
"description": "integrate our api with zapier",
"complete": false
},
{
"id": 6,
"created": "Mon, 25 Jun 2023 16:41:45 -0400",
"list_id": 1,
"description": "get published in zapier library",
"complete": false
}
]
```
The following assumes you're using the default primary key, the `id` field. When a Zap is first turned on, Zapier makes an initial call to your API to retrieve existing data, and caches and stores each `id` field in our database. When the Zap is turned off, that list is cleared.
Active Zaps then [poll at an interval](https://help.zapier.com/hc/en-us/articles/8496181725453#01H8C8M008GXFT36C42W1157P0) (based on a [customer's plan](https://zapier.com/pricing)) and compare the `id`s to all those seen before, trigger on new items, and update the list of seen `id`s.
Now let's say the user created a new task:
```json theme={null}
[
{
"id": 8,
"created": "Mon, 25 Jun 2023 16:42:09 -0400",
"list_id": 1,
"description": "re-do our api to support webhooks",
"complete": false
},
{
"id": 7,
"created": "Mon, 25 Jun 2023 16:41:54 -0400",
"list_id": 1,
"description": "integrate our api with zapier",
"complete": false
},
{
"id": 6,
"created": "Mon, 25 Jun 2023 16:41:45 -0400",
"list_id": 1,
"description": "get published in zapier library",
"complete": false
}
]
```
On the next poll after the new task is created, your API returns all tasks, but only the first task with `id` equal to `8` will be seen as a new item. That particular JSON object will then trigger the user's Zap and complete any subsequent action steps the user has defined. The essence of deduplication is that the other `id`s in the poll, `6` and `7` will be ignored, since their `id`s have been seen in previous polls.
In order for deduplication to work, the `id` field should always be supplied and unique amongst all items in the result.
Your API must return results in reverse-chronological order to make sure new/updated items can be found on the first page of results, as Zapier polling triggers don't automatically fetch additional pages. If your API lists items in a different order by default, but allows for sorting, include an order or sorting field in your polling request to ensure newest records are returned on the first page of results. [Github is a great example](https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#list-repository-issues) of an API that supports sorting on multiple fields in the `asc` or `desc` direction.
## Re-ordering returning items
If your API cannot order its results in reverse-chronological order, you can use [Code Mode](/platform/build/code-mode) to make additional requests, if necessary.
One possible scenario could be:
1. Fetch the first page, containing the oldest items, but also the total number of pages.
2. Fetch the last page and reverse the order of the items before returning results in an array.
When adding additional requests to your custom code, all requests and processing code for a trigger must [finish within 30 seconds](/platform/build/operating-constraints#timeouts-triggers). It is not recommended to attempt to fetch all pages of results.
If the items your API returns do not have an `id` field or you're adding an Updated Item trigger, you will use [Code Mode](/platform/build/code-mode) to modify the API response.
## Custom primary keys
In older, [legacy Zapier Web Builder apps](/platform/manage/versions-legacy), Zapier guessed what fields made a unique key if `id` wasn't present. It is now required that you define one or more fields as the primary key.
By default, Zapier uses the field with the key `id` as the primary key if no `outputFields` has `primary: true`. The `id` field would be required in this case. Otherwise, your trigger would run into an error at runtime. If your API's items have a differently-named unique field, adapt this code snippet to ensure this test passes:
```javascript theme={null}
// ...
let items = response.data.items; // or response.json.items if you're using core v9 or older
return items.map((item) => {
item.id = item.contactId;
return item;
});
```
Alternatively, if you're using the CLI, you can use non-id fields as the primary key. See [“How does deduplication work?”](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#how-does-deduplication-work) in the CLI docs for example code.
## Updated Item triggers
When triggering on updated items, you'll want to define the `id` field to be used for deduplication. Assuming your task API has an endpoint that can return tasks sorted by `updatedAt` in descending direction, here's example code to incorporate the `updatedAt` value with the `id`, so that Zapier recognizes a new update as a new item. Assuming that you have configured `options` with the appropriate API request URL and parameters:
```javascript theme={null}
return z.request(options).then((response) => {
response.throwForStatus();
const results = response.json;
results.forEach(function (result) {
result.originalId = result.id;
result.id = result.id + "-" + result.updatedAt;
});
return results;
});
```
Notice how the code preserves the original `id` value before setting `id` to a new combined value that is unique for every update of a task. This is useful to ensure that the original ID can still be used for other purposes, such as performing a search or associating records together.
Alternatively, if you're using the CLI, you can set `primary: true` for the `id` and `updatedAt` fields. See [“How does deduplication work?”](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#how-does-deduplication-work) in the CLI docs for example code.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/promotions/delete-enrollment.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Delete Promotion Enrollment
> Unenroll an account from a promotion.
Endpoint available to Partners only.
The request must be authenticated by an app access token the
Partner has received using the Client Credentials flow.
#### OAuth
This endpoint requires the `promotions:write` OAuth scope.
This API is [rate limited](/powered-by-zapier/api-reference/rate-limiting).
## OpenAPI
````yaml powered-by-zapier/api-reference/promotions-openapi.yaml delete /v2/promotions/{enrollment_id}
openapi: 3.1.0
info:
title: Powered by Zapier Promotions API
version: promotions
description: >-
The API to define promotions, powered by Zapier. See
https://docs.zapier.com/powered-by-zapier/introduction for more information.
contact:
name: Partner Sharing
servers:
- url: https://api.zapier.com
description: Production
security: []
tags:
- name: Promotions
description: Operations related to managing Promotions
- name: Experimental
description: >-
Operations that are not to be considered finalized, and are subject to
change
paths:
/v2/promotions/{enrollment_id}:
delete:
tags:
- Promotions
- Experimental
description: |-
Unenroll an account from a promotion.
Endpoint available to Partners only.
The request must be authenticated by an app access token the
Partner has received using the Client Credentials flow.
#### OAuth
This endpoint requires the `promotions:write` OAuth scope.
operationId: root_destroy
parameters:
- in: path
name: enrollment_id
schema:
type: string
required: true
responses:
'204':
description: No response body
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
Access:
value:
errors:
- status: '401'
code: not_authenticated
title: User Not Authenticated
detail: >-
User must be authenticated to access this resource. No
valid user access token was provided.
description: >-
Access denied: User does not have permission for enrollment_id:
enroll_67890
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
examples:
Forbidden:
value:
errors:
- status: '403'
code: permission_denied
title: Permission Denied
detail: You do not have permission to perform this action.
description: Forbidden - User lacks permission to access this location
'429':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
description: ''
'503':
headers:
Retry-After:
schema:
type: string
format: uri
description: Indicates when to retry the request
X-RateLimit-Limit:
schema:
type: string
format: uri
description: >-
The maximum number of requests you're permitted to make per
hour.
X-RateLimit-Remaining:
schema:
type: string
format: uri
description: >-
The number of requests remaining in the current rate limit
window.
X-RateLimit-Reset:
schema:
type: string
format: uri
description: >-
The time at which the current rate limit window resets in UTC
epoch seconds.
content:
application/json:
schema:
$ref: '#/components/schemas/PromotionErrorResponse'
description: ''
security:
- OAuth:
- promotions:write
components:
schemas:
PromotionErrorResponse:
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/PromotionError'
description: Errors encountered processing the request
required:
- errors
PromotionError:
type: object
properties:
status:
type: string
description: HTTP status code of the error
code:
type: string
description: Machine-readable error code
title:
type: string
description: Human-readable error title
detail:
type: string
description: Detailed description of the error
required:
- code
- detail
- status
- title
securitySchemes:
OAuth:
type: oauth2
description: >-
The user access token for the user you would like to enroll. See our
[OAuth2 authentication
documentation](https://docs.zapier.com/powered-by-zapier/api-reference/authentication#retrieving-a-user-access-token).
flows:
authorizationCode:
authorizationUrl: https://zapier.com/oauth/authorize/
tokenUrl: https://zapier.com/oauth/token/
refreshUrl: https://zapier.com/oauth/token/
scopes:
promotions:write: Enroll or unenroll accounts into promotions
promotions:read: View usage of promotions you manage on an account
clientCredentials:
tokenUrl: /oauth/token
scopes:
promotions:write: Unenroll accounts from promotions
````
---
# Source: https://docs.zapier.com/platform/manage/deprecate.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Deprecate or delete a version
> Deprecation is an optional process that allows you to set a date from which an integration version cannot be used anymore. Zapier is normally a “set it and forget it” experience for users, so use this feature carefully. Only if the version will no longer function, should it be deprecated. Please note that deprecating a version is significantly disruptive to our mutual users if a migration to a different version is not possible.
When users use any but the promoted version, they will [see the version displayed](https://help.zapier.com/hc/en-us/articles/18755649454989-App-versions-in-Zapier) and be able to manually update to the promoted version.
## What happens after setting a version to deprecate
The deprecation date must be between 3 weeks and 1 year in the future. We won't communicate the deprecation until 2 weeks before the deprecation date. This gives you time to migrate users to a newer version, before we start notifying them that they need to manually migrate.
### 1. Email notification
A notification email will be sent exactly 14 days before the configured deprecation date. This email includes the deprecation reason that newer versions of the Zapier CLI ask you for. We do recommend supplementing these automated messages by also notifying your general user base through in-app announcements or email marketing campaigns. For privacy reasons, Zapier cannot provide you with an email list of users of your integration.
### 2. Deprecation date reached
* Zaps that haven't been updated will be automatically paused.
* A second email, titled “X Zaps paused over deprecated apps,” will be sent out to those users. Customizing this email is not possible.
* Any attempts to test triggers or actions on the deprecated version will result in an error, and Zaps that use it cannot be enabled.
* The deprecated version will be labelled as “Deprecated” in the Zap editor, with a prompt for users to update to the latest version.
### 3. Post-deprecation
After the deprecation date, the version will still be visible in the Versions page for your future reference. Users will not be able to see the version once they select a different version in their Zaps.
## Deprecate a version with Platform UI
To deprecate an integration version:
1. Log into the [Platform UI](https://zapier.com/app/developer).
2. Select your **integration**.
3. In the *Manage* section in the left sidebar, click **Version**.
4. Click the **three dot** icon in line with the integration version you want to deprecate.
5. Click **Deprecate**.
6. In the dialog box, add the **Deprecation Reason** and **Deprecation Date**. You can set a deprecation date anytime between 3 weeks and 1 year from the current date. The deprecation reason will be used in user notifications.
7. Click **Deprecate**.
8. Click **Close**
## Deprecate a version with Platform CLI
To deprecate an integration version use the command `zapier-platform deprecate` (or deprecated `zapier deprecate`). Learn more about [Platform CLI commands](https://github.com/zapier/zapier-platform/blob/main/packages/cli/docs/cli.md#deprecate).
## Deleting deprecated versions
After your version has been deprecated, you have the option to delete versions entirely. Exercise this option with extreme caution. Deleting a version makes it permanently inaccessible, both to you and to your users. Deleted versions cannot be restored by Zapier Developer Support. Deletion should be a last resort, used only when you are certain that the version will never be needed again.
Deletion is also only possible when 0 users remain on a version. The count of users on the *Versions* page includes live Zaps only. If you're seeing the error `Unable to delete app version`, this can be caused by users on that version not included in the visible count (paused Zaps, app authentications for example).
***
### **We’re no longer supporting our integration and would like to remove it from the app listing. How can I unpublish the integration and deactivate it?**
For any public integration, the first step is to revert that integration to private, which will prevent new users from seeing it in the Zapier App Directory or in the Zap editor.
Once the integration is private, you can deprecate each version of that app (except the latest version, which will remain private if there are users still on the version). to deprecate an integration version, please follow the steps outlined above.
If the product's API endpoints will be shutdown, any users still using that now-private app in their Zaps, will begin to see errors when requests are made to those endpoints and their Zaps will eventually be turned off, no longer making requests.
That said, if you want to proceed with this, please reach out to Developer Support and we’ll help you revert your integration to private so that you can proceed with the next steps.
[*Need help? Tell us about your problem and we'll connect you with the right resource or contact support.*](https://developer.zapier.com/contact)
---
# Source: https://docs.zapier.com/platform/reference/dictionary-fields-tutorial.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Using Dictionary Fields
> Dictionary fields allows your users to directly send an object with their provided value sets to your API.
---
# Source: https://docs.zapier.com/platform/build/digestauth.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add authentication with Digest Authentication
> Digest Auth prompts users to enter their username and password, optionally along with any additional data your API requires for authentication. Zapier makes an unauthenticated API call to get the nonce from your server, and uses it to encrypt and pass the authentication data to your server with each API call.
{" "}
Use Digest Auth if your API uses the [RFC 7616](https://tools.ietf.org/html/rfc7616) authentication standard, where users enter their username and password to be passed encrypted to your API with the nonce key your app sends to Zapier on the first API call.
## 1. Build an input form
* Open the *Authentication* tab in Zapier visual builder and select *Digest Auth*.
{" "}
* The pre-built input form includes username and password fields already.
* Add additional fields if your API documentation requires it by selecting *Add Fields* and fill in the details for your field. Add the most commonly needed fields first, in the order users expect, as you cannot reorder fields once added.
{" "}
* Add the required *Key*, the name your API uses to reference this field.
* Fill in the optional fields, as appropriate, especially the *Label*:
**Label**: A human-friendly name for this field. Enter what this value is called inside your app's UI.
**Is this field required**: Check this box for the API key field, and any other fields your API requires to authenticate.
**Type**: All input fields use the `string` text field by default; select `password` instead if you would like to obscure the data as users enter it.
**Help Text**: Include details to assist users in authenticating with your app, especially if they may be unsure where to find the data needed within your app. Format text with [Markdown](https://zapier.com/blog/beginner-ultimate-guide-markdown/), and include a hyperlink if needed.
**Default Value**: Include a value for this field to be used as a fallback. For optional fields, the default value is set on initial connection creation and used in the API call instead of missing or null values every time the Zap runs. For required fields, this value is used during connection creation, but not when the Zap runs (Zapier raises an error for missing/null values instead).
* Input fields marked as password and all authentication fields with sensitive, private data such as both username and password from Digest Auth are automatically censored at runtime. These values are stored in the Auth bundle and used in API calls, but are replaced in Zapier's logs with a censored value like this `:censored:6:82a3be9927:`. Due to this, it is not possible to view the exact tokens or keys in Zapier's logs. To verify that the same token as was returned by the authentication, is being used in subsequent API calls; you can compare censored value characters, for example `:censored:6:82a3be9927:` would have the same value ending in 9927 when used in a subsequent call.
* Computed fields are not applicable to Basic Authentication and are only used with OAuth v2 and Session Auth.
* Each input field is listed with its label, key, type, and required status in your authentication settings. Click the field to edit it, or click the gear icon and select *Delete* to remove a field.
{" "}
## 2. Add a Test API Request
* Add an API call to your API that requires no configuration, typically a `/user` or `/me` call. Add the URL for the API call, and set the call type, typically a `GET`. This will test the user-entered credentials to ensure it enables a successful API call to your app.
* The Digest input fields you configured earlier are automatically included in the URL Params and the HTTP Headers. Click *Show Options* to remove the details where they are not needed or add any custom URL params or HTTP headers your API requires. It is typically not recommended to pass any sensitive information such as the password in the URL Params. Passing it through the headers or even the body is preferable.
{" "}
* To customize the test API request, select *Switch to Code Mode* and write custom JavaScript code to handle your test API call and the response parsing as needed. The first time you click the toggle, Zapier will [convert your API call to code](/platform/build/code-mode). If you switch back to Form Mode though, Zapier will not convert your code changes to the Form Mode, nor will any subsequent changes in the form be added to your code.
## 3. Configure a Connection Label
Review [connection label documentation](/platform/build/connection-label) to optionally differentiate the app accounts users connect.
## 4. Test your authentication
Connect a valid user account to [test authentication](/platform/build/test-auth).
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build-cli/download-source-code.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Download the source code of a CLI integration
> If at any point you do not have the source code for your CLI integration and need it to make changes, you can download a zip file of the source code directly from the Platform UI.
## Prerequisites
Before doing this, you would have to ensure that:
* You are an admin for the integration. If you are not, you can have an admin [invite you](https://docs.zapier.com/platform/manage/add-team) to be a member of the integration team.
* Your dev environment meets the [requirements for running Platform CLI](https://docs.zapier.com/platform/build-cli/overview#requirements) with the proper version of Node.js installed.
* You have installed the Platform CLI tool in your local environment and set up your authentication.
```bash theme={null}
# install the CLI globally
npm install -g zapier-platform-cli
# setup auth to Zapier's platform with a deploy key
zapier-platform login
```
## Downloading the source code
The steps to downloading the source code are:
1. Log in to the Platform UI and access the CLI integration for which you would like to get the source code.
2. On the sidebar, click on “Advanced”.
3. Go to the “View Source” section.
4. Click the “Download” button

Note that, after getting the source code, you would need to go into the directory and run the `npm install` command in order to install all the libraries needed for your integration. Then you can start making changes to the integration code, following our [best practices](https://docs.zapier.com/platform/build-cli/overview).
***
[*Need help? Tell us about your problem and we'll connect you with the right resource or contact support.*](https://developer.zapier.com/contact)
---
# Source: https://docs.zapier.com/platform/reference/dynamic-dropdown-tutorial.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Creating dynamic dropdown fields
> Dynamic dropdown fields are useful when users need to select data from an existing list of similar data in their account on your app.
---
# Source: https://docs.zapier.com/platform/build-cli/dynamic-dropdowns.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Dynamic dropdowns
Sometimes, API endpoints require clients to specify a parent object in order to create or access the child resources. For instance, specifying a spreadsheet id in order to retrieve its worksheets. Since people don't speak in auto-incremented ID's, it is necessary that Zapier offer a simple way to select that parent using human readable handles.
Our solution is to present users a dropdown that is populated by making a live API call to fetch a list of parent objects. We call these special dropdowns "dynamic dropdowns."
## Definition
To define one you include the `dynamic` property on the `inputFields` object. The value for the property is a dot-separated *string* concatenation.
```js theme={null}
//...
issue: {
key: 'issue',
//...
create: {
//...
operation: {
inputFields: [
{
key: 'project_id',
required: true,
label: 'This is a dynamic dropdown',
dynamic: 'project.id.name'
}, // will call the trigger with a key of project
{
key: 'title',
required: true,
label: 'Title',
helpText: 'What is the name of the issue?'
}
]
}
}
}
```
The dot-separated string concatenation follows this pattern:
* The key of the trigger you want to use to power the dropdown. *required*
* The value to be made available in bundle.inputData. *required*
* The human friendly value to be shown on the left of the dropdown in bold. *optional*
In the above code example the dynamic property makes reference to a trigger with a key of project. Assuming the project trigger returns an array of objects and each object contains an id and name key, i.e.
```js theme={null}
[
{ id: "1", name: "First Option", dateCreated: "01/01/2000" },
{ id: "2", name: "Second Option", dateCreated: "01/01/2000" },
{ id: "3", name: "Third Option", dateCreated: "01/01/2000" },
{ id: "4", name: "Fourth Option", dateCreated: "01/01/2000" },
];
```
The dynamic dropdown would look something like this.

## Use a resource
In the first code example the dynamic dropdown is powered by a trigger. You can also use a resource to power a dynamic dropdown. To do this combine the resource key and the resource method using camel case.
```js index.js theme={null}
const App = {
// ...
resources: {
project: {
key: "project",
// ...
list: {
// ...
operation: {
perform: () => {
return [{ id: 123, name: "Project 1" }];
}, // called for project_id dropdown
},
},
},
issue: {
key: "issue",
// ...
create: {
// ...
operation: {
inputFields: [
{
key: "project_id",
required: true,
label: "Project",
dynamic: "projectList.id.name",
}, // calls project.list
{
key: "title",
required: true,
label: "Title",
helpText: "What is the name of the issue?",
},
],
},
},
},
},
};
```
## Hide the trigger
In some cases you will need to power a dynamic dropdown but do not want to make the Trigger available to the end user. Here it is best practice to create the trigger and set `hidden: true` on it's display object.
```js theme={null}
const App = {
// ...
triggers: {
new_project: {
key: "project",
noun: "Project",
// `display` controls the presentation in the Zapier Editor
display: {
label: "New Project",
description: "Triggers when a new project is added.",
hidden: true,
},
operation: {
perform: projectListRequest,
},
},
another_trigger: {
// Another trigger definition...
},
},
};
```
## Dependencies between dropdowns
You can have multiple dynamic dropdowns in a single trigger or action. In some cases, a dynamic dropdown depends on the value chosen in another dynamic dropdown when making its API call. The [Google Sheets](https://zapier.com/apps/google-sheets/integrations#triggers-and-actions) integration displays an example of this pattern.
The example below illustrates a 'New Worksheet' trigger that populates a dynamic dropdown input field to select a worksheet:
```js theme={null}
{
key: "worksheet",
// ...
operation: {
// ...
perform: async (z, bundle) => {
const response = await z.request("https://example.com/api/v2/projects.json", {
params: {
spreadsheet_id: bundle.inputData.spreadsheet_id,
},
});
// response.throwForStatus() if you're using core v9 or older
return response.data; // or response.json if you're using core v9 or older
}
}
}
```
Assume there is another `New Records` trigger with `Spreadsheet` and `Worksheet` dynamic dropdown input fields, which have keys `spreadsheet_id` and `worksheet_id` respectively. The selected spreadsheet value is available via `bundle.inputData.spreadsheet_id` to be used by the `Worksheet` trigger.
```js theme={null}
const App = {
// ...
triggers: {
// ...
issue: {
key: "new_records",
// ...
operation: {
inputFields: [
{
key: "spreadsheet_id",
required: true,
label: "Spreadsheet",
dynamic: "spreadsheet.id.name",
altersDynamicFields: true,
},
{
key: "worksheet_id",
required: true,
label: "Worksheet",
dynamic: "worksheet.id.name",
},
],
},
},
},
};
```
> Note: Be mindful that a dynamic dropdown can depend on the value chosen in another dynamic dropdown. Two types of dependencies can exist between fields:
>
> *Requirement dependency*: Affects how dependent fields are enabled or disabled within the UI
>
> * Setting `required: false` makes a field optional and always enabled in the UI.
> * Having no required value set makes a field optional and disabled until the dependencies are selected.
>
> *Value dependency*: Affects how dynamic dropdown field options are retrieved
>
> * Setting a required value or not does not affect how the options of a dynamic field are retrieved.
>
> So, if you have an optional dynamic dropdown that depends on another dropdown input field, that field should not have `required: false` set. Input fields are optional by default, but setting `required: false` on an optional dynamic dropdown field that depends on another removes the requirement dependency relationship.
> In the example above, the `worksheet_id` input field will be disabled until the `spreadsheet_id` input field has a value in Zapier's products such as the Zap editor. Notice that setting `altersDynamicFields: true` signifies other input fields need to be recomputed whenever the value of that field changes.
## Detect when a trigger is used for a dynamic dropdown
If you want your trigger to perform specific scripting for a dynamic dropdown you will need to make use of `bundle.meta.isFillingDynamicDropdown`. This can be useful if need to make use of [pagination](/platform/build-cli/faqs#whats-the-deal-with-pagination-when-is-it-used-and-how-does-it-work) in the dynamic dropdown to load more options.
```js theme={null}
const App = {
// ...
resources: {
project: {
key: "project",
// ...
list: {
// ...
operation: {
canPaginate: true,
perform: () => {
if (bundle.meta.isFillingDynamicDropdown) {
// perform pagination request here
} else {
return [{ id: 123, name: "Project 1" }];
}
},
},
},
},
issue: {
key: "issue",
// ...
create: {
// ...
operation: {
inputFields: [
{
key: "project_id",
required: true,
label: "Project",
dynamic: "projectList.id.name",
}, // calls project.list
{
key: "title",
required: true,
label: "Title",
helpText: "What is the name of the issue?",
},
],
},
},
},
},
};
```
## Link a search action
This feature makes it easier for users to handle the following scenario in a workflow that has multiple steps:
* The value for the input field depends on an output field from an earlier step.
* The value of that output field cannot be used directly.
* They need an additional search step that takes the output they *cannot* use directly, and translate it into something they *can*.
**Example:** Let's say the input field takes the ID of a lead. The user could select a lead from the dynamic dropdown, but then the workflow would act on the same lead every time it runs. An earlier step returns the email address of the lead, but not their ID. The user will need to prepend a search-step that takes the email address and returns the ID.
Users can do this themselves, but by using this feature, Zapier products can make this task easier.
### How it works for the user
In the Zap editor for example, dynamic dropdowns that use this feature will display a
button next to the dynamic dropdown. When the user clicks the button, the right search step is automatically prepended, and correct output field mapped into the dynamic dropdown.

### How to configure it
In the definition of the input field, configure `search` with a value of `.`.
* Replace `` with the `key` of the search action that should prepeded to the user's workflow.
* Replace `` with the `key` of the output field from that search action that should be mapped as value for the input field.
Here's an example:
```js theme={null}
{
key: 'project_id',
required: true,
label: 'Project',
dynamic: 'list_projects.id.name',
search: 'search_projects.id',
}
```
---
# Source: https://docs.zapier.com/platform/build/dynamic-field.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Send or receive dynamic user-defined fields through your API
> Dynamic fields are a type of field built from an API call. Custom code runs to show fields based on other input field data. These are especially useful with project management apps, CRM apps, databases, and any other app where users can add custom, user-defined fields.
## Add a dynamic field
You can use dynamic fields, to retrieve fields in three different contexts:
* Whenever the value of a field with `altersDynamicFields` is changed.
* Whenever the *Set up* section for the action is opened in the Zap editor.
* Whenever the *Refresh Fields* button is used on the action.
In the [Platform UI](https://zapier.com/app/developer):
1. In the *Build* section in the left sidebar, click on your **action**.
2. Click the **Input Designer** tab.
3. Click **Add** and select **Dynamic Field**.
4. A code box will appear. Add your **JavaScript code** to make an API call and fetch the fields from your app's API. Use Zapier's `z.request` to make the API call. Your code should return each custom field's key and name to Zapier in an array, so they display correctly in the Zap editor. Learn more about using [Z Object to call a function](https://github.com/zapier/zapier-platform/blob/master/packages/cli/README.md#z-object).
5. Once you've added your JavaScript code, click **Save**.
**Note**:
* Do not rely on any input fields already having a value, since they won't have one the first time the Zap editor loads.
* Dynamic fields using `z.request` will not show in the Zap editor preview.
* Dynamic fields can only be added to actions, not triggers.
## Create a dynamic field based on previous input field data
In the [Platform UI](https://zapier.com/app/developer):
1. In the *Build* section in the left sidebar, click on your **action**.
2. Click the **Input Designer** tab.
3. Review your input field settings, you'll need at least one input field that has **Alters Dynamic Fields** selected. This is the field that Zapier will use to decide if the dynamic field should be shown.
4. Click **Add** and select **Dynamic Field**.
5. A code box will appear. Add your JavaScript code that evaluates data from previous fields (referencing `bundle.inputData.field_key` where `field_key` is replaced with the actual key of the prior input field that must be checked), including logic and details on another field to show depending on the value of the former.
6. Once you've added your JavasScript code, click **Save**.
## Send dynamic field data to your API
In the [Platform UI](https://zapier.com/app/developer):
1. In the *Build* section in the left sidebar, click on your **action**.
2. Click the **API Configuration** tab.
3. Click **Switch to Code Mode**
4. In the dialog box, click **Switch to Code Mode**
5. A code box will appear. Add your Javascript code, that include `body: { ...bundle.inputData }` to send every input field, including pre-defined or dynamic fields in the body of your API call to your app. You can also use `bundle.inputData.field_key` to include individual lists of dynamic fields.
6. Once you've added your JavasScript code, click **Save**.
## Test a dynamic field
To test how your dynamic fields will appear in the Zap editor:
1. [Create a new Zap](https://zapier.com/app/editor/).
2. Add the action to your Zap that includes your dynamic field. This will allow for you to test how your action will appear to users.
If you want more details about the API calls being made, in the [Platform UI](https://zapier.com/app/developer):
* In the *Manage* section in the left sidebar, click **Monitoring**.
* You'll see a graph and be able to click on data points to view events and details to troubleshoot your setup further.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/embedding-zapier/elements-security.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Element Security
> Keeping our elements secure and usable is critical at Zapier
User security is paramount. By default, Zapier denies any embedding of our product unless you provide us with a list of domains that you expect to embed Zapier in.
This protects the user from malicious activities like [Clickjacking](https://www.owasp.org/index.php/Clickjacking). :

## Provide a list of domains
If you've already embedded our Product, this would have already been captured and your product domains are permitted.
* To add domains, navigate to the Settings tab under the Embed section in the sidebar of your integration's [Platform UI](https://developer.zapier.com/), and add the missing domains under the 'Embedding Domains' section.

These specific domains are then permitted to embed Zapier. The domains provided by you should be registered with your company with a public registrar. That is to say a `randomcnamedomain.com` is not valid for the same reason that a user or bad actor could register that domain.
## Troubleshooting
* `localhost`, `yourcomp.local` and `127.0.0.1` are not valid supported domains. An option during your embed development would be to use a tunnel service like [ngrok](https://ngrok.com/) and to register that ngrok tunnel with us. Be advised, that we will ask for a static domain from ngrok.com or similar tunneling service.
* If the domain you're embedding on is added to the allowlist within *Manage Domains*, but you're seeing the `This embed is blocked` error, the [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) may be too restrictive/overly strict. You'll want to check Console/Network for the appropriate request to see the [referrer-policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy) header. Using `strict-origin-when-cross-origin` as the referrer-policy is recommended.
* For local development, use [ngrok](https://ngrok.com/) to make `https` test URLs when needed, as using `http` would be blocked, even if the domain has been added to the allowlist.
---
# Source: https://docs.zapier.com/platform/manage/embed-activation.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Embed activation rates
> Consider all the user clicks on Zap Templates surfaced in your embeds. The embed activation rate is the percentage of those Zaps that actually activated within 24 hours of creation, meaning the Zap ran at least one successful task. It measures the efefctiveness of the Zapier embeds in your product at converting user clicks on Zap Templates to Zap activations.
In your integration's *Insights*, along with activation rate, see a funnel-view of users who signed up for Zapier, created Zaps, enabled Zaps, and activated Zaps from Zap Templates in your embeds.
A low activation doesn't necessarily mean something is broken. Both your integration and embed(s) could be implemented correctly and in good health, but you could still be seeing low activation rates. Embed insights can help identify where in their journey users are hitting challenges with activating, whether it's the Zapier sign up, Zap setup or enablement stage.
## Key Zapier insights
Embed insights and activation rates are strong indicators of user awareness and integration usability. If the click-to-sign-up ratio is really low, perhaps you haven't set sufficient context and expectations where the embed is placed for users to feel confident when they land on Zapier.com. If the create-to-enabled ratio is low, users could be having trouble with authenticating or field mapping once they're in the Zap editor creating a Zap from the template.
## Best practices
* If there are no *Embed insights* in your Dashboard, there are no embeds associated with the integration. Check out the *Embed* tab of your integration's Dashboard or our [Powered by Zapier](https://zapier.com/l/partner/solutions) documentation to see how you can start embedding. Embed features are only available for public integrations.
* We offer a variety of [embed tools](https://platform.zapier.com/embed/overview) as different options work best for different Partners and their platforms. Implement a combination of our partner tools and compare metrics to see which implementations are most successful for your use case.
* Users are more likely to sign-up when they are aware of Zapier and the value we provide by integrating to your app. Give context of Zapier via a brief onboarding flow or link to help docs so users know what to expect.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/embedding-zapier/embed-insights.md
# Source: https://docs.zapier.com/platform/manage/embed-insights.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Embed insights definitions
> Embed features are available for public integrations.
All metrics can be filtered by *All Embeds* or [individual embeds](https://cdn.zappy.app/195883ab4fd7897224bcec00b7bf9b13.png), and the [last 7, 30, and 90 days](https://cdn.zappy.app/e3d334462ad532540710a7ce0d975942.png), hover over the metric to see the percentage and count figures.
Definitions for each of the metrics provided in the integration dashboard below:
| **Metric** | Definition |
| -------------------------------------- | ---------------------------------------------------------------------------- |
| **Total conversion** | Percentage of users who clicked on Zap Templates and activated a Zap. |
| **Users who clicked on Zap Templates** | Percentage and count of users who clicked on a Zap Template in an embed. |
| **Users who signed up for Zapier** | Percentage and count of users who signed up for a new account on Zapier. |
| **Users who created Zaps** | Percentage and count of users who started a Zap in the editor. |
| **Users who enabled Zaps** | Percentage and count of users who created and successfully published a Zap. |
| **Users who activated Zaps** | Percentage and count of users who created a Zap that successfully ran tasks. |
## Best practices
* Test different iterations of embeds and compare rates to see which ones resonate most with your users. Do certain sets of Zap Templates garner more clicks and activations than others? Does enabling “App search” on the Full Zapier Experience, so users can see all the apps they can integrate with, increase activations?
* Improve your Zap Templates with short, descriptive titles, and as much [prefilled field mapping](https://platform.zapier.com/embed/zap-editor#prefill-options) as possible, so users are immediately aware of the use case and can activate the Zap with the least amount of clicks.
* Provide context with your embed through help docs or an onboarding flow guiding users on how to connect your app with others using Zapier to improve the *Users who signed up for Zapier* rate.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build-cli/empty-values-in-input-data.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Empty values in input data
> Handing empty values in `bundle.inputData` in your `perform*` functions
zapier-platform-core v18 introduced a new flag named `cleanInputData`. This flag allows you to tell Zapier whether it should automatically remove empty values, including `null`, `[]` (empty arrays), and `{}` (empty objects), from `bundle.inputData` before passing it to your `perform*` functions.
By default, the `cleanInputData` flag defaults to true, which matches the behavior of all versions prior to v18. Starting with v18, we encourage you to **explicitly set this flag to false**, either globally in `App.flags` or per trigger/action in the `operation` object. For example:
```javascript theme={null}
const App = {
flags: {
cleanInputData: false, // global flag (defaults to true if not set)
},
triggers: {
recipe: {
operation: {
cleanInputData: false, // per-action flag, can be omitted if same as global
},
},
},
creates: {
recipe: {
operation: {
cleanInputData: true, // only enable for this action, overrides global flag
},
},
},
};
```
## When `cleanInputData` is true
When `cleanInputData` is true, Zapier removes any empty values **recursively** from `bundle.inputData` before passing it to your `perform*` (including `perform`, `performList`, `performGet`, etc) functions. For example, given the following input data:
```json theme={null}
{
"name": "Chocolate Cake",
"description": "",
"tags": [null, "", "dessert"],
"metadata": {
"author": null,
"ratings": {},
"comments": []
}
}
```
The resulting `bundle.inputData` passed to your `perform` function would be:
```json theme={null}
{
"name": "Chocolate Cake",
"tags": ["dessert"]
}
```
## When `cleanInputData` is false
When `cleanInputData` is false, Zapier preserves all empty values in `bundle.inputData`. Using the same example input data above, the resulting `bundle.inputData` would be:
```json theme={null}
{
"name": "Chocolate Cake",
"description": "",
"tags": [null, "", "dessert"],
"metadata": {
"author": null,
"ratings": {},
"comments": []
}
}
```
Your `perform` function would then need to handle these empty values appropriately.
We recommend setting `cleanInputData` to false and handling empty values explicitly in your code. This approach provides greater control for developers and avoids unexpected behavior, especially when dealing with nested input data (e.g., line items).
If your `perform*` functions didn't previously handle empty values, **setting
`cleanInputData` to false may break your code!** Make sure to test your
triggers or actions before rolling out this change to users.
---
# Zapier MCP Enterprise Access Request
Thanks for your interest in using Zapier MCP!
If you're currently on a Zapier Enterprise plan, you can request access below.
## Form Fields
### Full Name (required)
### Email (required)
### Company Name (required)
### What will you use Zapier MCP for? (required)
[Submit]
---
# Source: https://docs.zapier.com/platform/build/env.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Use environment variables in your API call
> Integrations can define environment variables that are available when the app's code executes. They are useful when you have data like an OAuth client ID and secret that you don't want to commit to source control. Environment variables can also be used as a way to toggle between a staging and production environment during app development and this would be recommended instead of the use of an independent integration for staging purposes.
Environment variables are defined on a per-version basis. Much like in local development environments such as the one in the [Platform CLI](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#environment), environment variables store key and value pairs outside of your app's API calls. Instead of hardcoding critical, secret values into your API authentication, trigger, and action calls, it's best to add them as environment variables in your integration, then reference the environment variable in your API calls.
If using OAuth v2 Authentication, the client ID and client secret fields are reserved environment variables. You'll need to use custom variable names for any other variables.
## 1. Add environment variables
To add environment variables:
* Log into the [Platform UI](https://zapier.com/app/developer).
* Select your **integration**.
* In the *Build* section in the left sidebar, click **Advanced** . There you can add your environment variables including a key and a value for each.
* Click **Add** to include additional environment variables, or click the `x` icon to remove variables if needed.
* Once you've completed adding a key and value, click **Save**.
## 2. Reference environment variables
Use environment variables in any Zapier integration API call through the form's *Show Options* link, selecting *Request Body*, *URL Params* or *HTTP Headers* as your API expects. Reference the environment variable you've configured under *Advanced*, in the form with the following text, replacing `YOUR_KEY` with your actual key: `{{process.env.YOUR_KEY}}` Zapier will then replace that variable with the value for that key from your *Advanced* settings and will use the correct value every time if you change it in the future. You can also reference environment variables in custom code if you switch your API call to code mode.
## 3. Change environment variables
It is possible to change your environment variables in a new version of your integration, or when switching from dev to production endpoints for the release of your integration to the public.
To change an environment variable:
1. Log into the [Platform UI](https://zapier.com/app/developer).
2. Select your **integration**.
3. In the *Build* section in the left sidebar, click **Advanced**.
4. Edit the text in the **Values** column with the new variable values. You cannot edit the *Key*. If you need to change a key and its value, first delete the old key, then add a new one instead.
## 4. Use environment variables for staging and production versions
We strongly recommend against the use of an independent integration for staging purposes. By utilising [version control](/platform/manage/versions) and environment variables instead, the deployment, integration and user management processes (eg. migration) will be significantly improved for your integration. It also helps [Developer Support](https://developer.zapier.com/contact) establish exactly what you're working on and identifying relevant logs.
It is conventional to reserve one version for testing/staging and one version for production, setting the applicable environment variables under *Advanced* in each.
If you want to be able to work with both environments in development in one version, one approach is the following:
* Set environment variables for both domains you want to call
* Set another environment variable for the domain you want to work with. For example, `key: ENVFLAG / value: staging`
* Throughout the app, in [Code Mode](/platform/build/code-mode), check the value of the latter variable and conditionally reference the corresponding domain environment variable.
For example:
```js theme={null}
let domain;
if (process.env.ENVFLAG === "staging") {
domain = process.env.STAGING
} else {
domain = process.env.PRODUCTION
}
const options = {
url: domain // conditional, depending on envFlag
method: 'POST',
headers: {
// headers
},
body: {
// body
}
}
```
Thus, during development, you can toggle the value of one environment variable to conditionally call the corresponding domain.
However, once a version is pushed to production, the variables are fixed, so in the case of a [public app](/platform/quickstart/private-vs-public-integrations) make sure to set the flag environment variable accordingly before promoting.
## 5. Allow users to select an environment
Certain apps need to allow users to select the domain during authentication. To do so, create an [input field in the authentication form](/platform/build/oauth#optional-input-form), allowing the user to pick which domain they want their connection to interact with.
Reference the user's selection with `{{bundle.authData.env_url}}` throughout the integration to conditionally call the corresponding domain.
## Video Tutorial
You can refer to this video on using environment variables:
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/error-array-expected.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Error: An array is expected
> When you add a polling trigger or search action to your integration, the Zapier platform [expects a bare array of new or found items returned](/platform/build/response-types), sorted in reverse chronological order. An API may instead return a result _object_ that contains the array of items the trigger/search needs.
## Error shown
For example, for a “Find Issue” search action with GitHub's API, we might start with a `https://api.github.com/repos/{{bundle.inputData.owner}}/ {{bundle.inputData.repo}}/issues/{{bundle.inputData.issue_number}}` request:
{" "}
{" "}
When tested, Zapier will show an error message `Results must be an array, got: object,`
{" "}
{" "}
Check the API response in the HTTP tab of the *[Test your API Request](/platform/build/test-triggers-actions)* section, and you'll see an *object* that contains the array of items we need was returned, not the array itself:
{" "}
{" "}
## Solution
Instead, return that array of channels to Zapier. To do that switch to [Code Mode](/platform/build/code-mode) in your request. That will allow you to provide a JavaScript function to handle the request, and make needed changes to the structure or content of the result before returning data to the Zapier platform.
For this request, wrap the response with an array instead of the default `return results`, to have Zapier return an array of issues.
{" "}
{" "}
> Remember: [Code Mode](/platform/build/code-mode) is a toggle; if you switch back to Form Mode your code will be ignored!
Now, retest the request and it should run successfully.
{" "}
{" "}
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/error-cannot-retrieve-app.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Error: Cannot retrieve App******CLIAPI@*** app
## Error shown
When attempting to use a Zap that has a private integration in a Team and Enterprise Zapier account, the private integration step could show an error that says:
`Cannot retrieve App******CLIAPI@*** app`
This occurs in Team and Enterprise Zapier accounts, and it happens when the private integration has not been explicitly [shared](/platform/manage/sharing) with the Zap owner.
This can happen if the Zap changes ownership, or if the Zap owner was removed from using the private integration, after it has been previously shared with them.
## Solution
To resolve this, an integration admin would need to [share](/platform/manage/sharing) the private integration with the owner of the Zap so that they have access to use the private integration on their Zaps.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/reference/error-handling-tutorial.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Implementing Error Handling
> Error handling enables you dictate how your integration should function when certain errors are returned from your API.
---
# Source: https://docs.zapier.com/platform/manage/error-handling.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Improve error response handling
> Errors from your API cause pain for users at two vital points:
* During the Zap setup process, stopping them from enabling and activating their Zaps
* During the Zap's runtime, once it has been turned on, preventing the Zap from completing all actions successfully
Zap runs that encounter an error response status code when making a request to your API throw an exception and receive the “Stopped / Errored” status. This will [display an error message to the user](https://help.zapier.com/hc/en-us/articles/20505304170637-Review-Zap-run-statuses) in their Zap History and they will be notified via email based on their [notification settings](https://help.zapier.com/hc/en-us/articles/8496289225229-Manage-notifications-when-errors-occur-in-Zaps).
Even if the `message` included in the response details an error, users should **never receive** a success/200 response if there was an error in the request as this will not show up as an error in the Zap history.
If [95% of a Zap's runs in the last 7 days are assigned the “Stopped / Errored” status](https://help.zapier.com/hc/en-us/articles/8496037690637-Troubleshoot-errors-in-Zapier#500-series-error-codes-0-3), the Zap will be automatically turned off. The Zap will not run again until the user manually enables it, so only return an error if the scenario is truly an error that needs to be fixed.
Monitor spikes in errors from the the *Monitoring* page in the Platform UI as leading indicators of problems users are facing within your integration.
The more descriptive and thorough [error handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-handling) your API and integration have in place, the easier it will be for users to resolve their own issues and for Zapier's support team to assist with debugging.
If you don't have control to make changes to the API itself, utilize custom error handling to improve your error messages:
* Elaborate on briefly worded errors with user-friendly messaging.
* When writing user-facing error messages however, keep the message below 250 characters total as Zapier truncates errors from integrations at 250 characters when displaying them to users.
* Update “not\_authenticated” to “Your API Key is invalid. Please reconnect your account.”
* Surface specific information to users regarding the field and why it's producing an error. This empowers users to fix Zap issues independently.
* Instead of “Provided data is invalid”, return “Contact name is invalid”.
* Improve “Contact name is invalid” with “Contact name exceeds character limit.”
* Format the error to include a second, optional argument code machines can use to identify the type of error, and last, optional argument of a HTTP status code. `throw new z.errors.Error('Contact name exceeds character limit.', 'InvalidData', 400);`
Your app integration can use custom code to improve the user experience in Zapier by returning a user-friendly message and optional error and status code. Typically, this will be prettifying 4xx responses or APIs that return errors as 200s with a payload that describes the error. The code and status is used by Zapier to provide relevant troubleshooting to the user when communicating the error.
## Prerequisites
* Documentation for the API you're working with that includes the response status codes per endpoint
* Familiarity with [general error handling in Zapier](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#general-errors).
## 1. Custom errors in Platform CLI
Switching to the [Platform CLI](/platform/manage/export-cli), allows you to [make use of HTTP middleware](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#using-http-middleware) to implement any [custom error response handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#error-response-handling).
This will allow you to write a single script that applies across the entire integration to detect a specific error from the API, and show the relevant message to the user within Zapier.
## 2. Custom errors in Platform UI
When you build and maintain your app in the UI, custom error handling can still be implemented. The main difference is that you'll need to add it to each individual element of the integration (triggers, actions, searches, authentication) that could encounter the error.
In the UI, `skipThrowForStatus` is set from the [Advanced tab](/platform/build/errors). This allows for custom error handling for status codes above 400. Note that 401 status codes will throw a `RefreshAuthError` [regardless](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#user-content-error-response-handling).
Once set, you can add [error handling](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#general-errors) when in Code Mode within the API Configuration for each trigger/action/search.
```js theme={null}
return z.request(options).then((response) => {
if (response.status === 404) {
throw new z.errors.Error(
"An error was returned. Help!",
"InvalidData",
404,
);
}
return response.json;
});
```
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/error-non-object-array.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Error: Got a non-object result in the array, expected only objects
> When using a REST Hook trigger, the data returned by the perform must be an array.
## Error shown
If an API returns a non-object result within the array, or an array of arrays, the following error will show.
`Got a non-object result in the array, expected only objects ( )`
The non-object result will be wrapped in the parentheses for the error message.
## Solution
If the data included in the webhook needs to be transformed, or includes multiple objects, you can add custom code to parse the response data in `bundle.cleanedRequest` within the Perform into an array of objects.
If your webhook already provides an array, remove the wrapping array that Zapier includes by default and simply return `bundle.cleanedRequest`.
{" "}
{" "}
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build/error-non-object.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Error: Got a non-object result, expected an object from create
## Error shown
When you add a create action to your integration, the Zapier platform [expects a single object to be returned](/platform/build/response-types), containing an `id` and details about the new item created. If an API returns a non-object result, the following error will show.
`CheckError: Invalid API Response: - Got a non-object result, expected an object from create`
## Solution
Instead, make sure your API returns an object to Zapier. To do that switch to [Code Mode](/platform/build/code-mode) in your request. That will allow you to provide a JavaScript function to handle the request, and make needed changes to the structure or content of the result before returning data to the Zapier platform.
If an array is returned, you would parse the response to return the object, without being enclosed in an array.
This could be by enclosing the `results` in a `{ }`, or reaching into the array and pull out the object that represents what you want to return to the user.
Remember: [Code Mode](/platform/build/code-mode) is a toggle; if you switch
back to Form Mode your code will be ignored!
Once you retest the create request, it should run successfully.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/powered-by-zapier/api-reference/common-types/errors.md
# Source: https://docs.zapier.com/platform/build/errors.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Add error response handling
> If your API returns responses with a status code above 400 that should not automatically throw an error then Zapier recommends enabling skipThrowForStatus.
This feature allows you to create custom error handling script for status codes above 400. Note that 401 status codes will throw a `RefreshAuthError` [regardless](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#user-content-error-response-handling).
To enable `skipThrowForStatus`:
## 1. Enable skipThrowForStatus
* Log into the [Platform UI](https://zapier.com/app/developer).
* Select your **integration**.
* In the *Build* section in the left sidebar, click **Advanced**.
* Click the **Settings** tab.
* Click the **On** toggle next to *Enable skipThrowForStatus*.
* Click **Save**.
## 2. Use Code Mode to add error handling script
You'll need to add error handling script to your authentication, triggers, actions that could encounter the error using [Code Mode](/platform/build/code-mode).
```js theme={null}
return z.request(options).then((response) => {
if (response.status === 404) {
throw new z.errors.Error(
"Insert error message to user here",
"InvalidData",
404,
);
}
return response.json;
});
```
Learn more about [general error handling in Zapier](https://github.com/zapier/zapier-platform/blob/main/packages/cli/README.md#general-errors).
## Video Tutorial
You can refer to this video on implementing error handling:
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/essential-tips-iq.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Essential tips for integrating quality health practices
> Our shared customers rely on Zapier and your integration for business-critical workflows. Addressing feedback early and often ensures users have the best experience, both with Zapier's platform and yours. Follow these tips on how.
## 1. Embrace early bug resolution
Early bug resolution prevents minor issues from escalating into significant problems, ensuring your users have a smooth and reliable experience.
## 2. Prioritize user-requested features
Requests for new features are invaluable insights into your user needs and pain points. Prioritizing these requests in your development roadmap can help enhance the functionality of your integration and significantly boost user retention and loyalty.
> Pro tip: Explore users' most valued and widely used features per app category! Head over to our [must-have triggers and actions](/platform/quickstart/must-have-triggers-and-actions) page for details.
## 3. Make Zapier an integral part of your product strategy
Your integration is a powerful tool for automating workflow, increasing productivity, and providing value to your users. Including it in your product expansion strategy and product roadmap planning, ensures it evolves in tandem with your core offerings.
> Pro tip: Read on how you can [prioritize user feedback](https://zapier.com/blog/prioritize-user-feedback-with-beamer/) in your product roadmap planning.
## 4. Spread the word about your integration's new features
Highlight new features and enhancements to your integration in your marketing materials. Adding these to newsletters, blogs, and in-product messages (IPMs), can help drive engagement and encourage users to explore new functionalities, leading to increased adoption and deeper integration into their daily workflows.
> Pro Tip: Get your integration in front of more users by embedding [Powered by Zapier](https://zapier.com/partner/solutions/plug-and-play) directly into your product.
## 5. Keep your integration fresh with regular updates
Regular updates signal to your users that you are committed to continuously improving their experience. Establish a cadence for updates that align with your sprint cycles.
> Pro tip: Add them to your calendar.
**Next Steps:**
* Actively monitor user feedback
* [Leave a comment](/platform/manage/user-feedback) on the Bugs & Feature Requests section inside your Partner Dashboard
* When promoting a version, link any open bug reports and feature requests that the newly promoted version addresses
* *Only possible when promoting within the Platform UI*
* Leverage [Quick Account Creation](https://platform.zapier.com/embed/quick-account-creation) to ease user signup friction and enhance security, through your embed placement
* Make staying on top of your open bugs and feature requests a priority by leveraging [Zapier Issue Manager](/platform/manage/user-feedback#3-consider-zapier-issue-manager)
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/export-cli.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Export integration to Platform CLI
> The Zapier Platform CLI (Command Line Interface) is a toolset you install and run in your local development environment. It allows you to build, test, and manage your Zapier integration through JavaScript code and terminal commands.
Platform UI is the way for users with API experience that are more comfortable with a visual form editor to build integrations on Zapier.
The CLI is, on the other hand, the most powerful tool for professional developers and teams. Some of the advantages:
* Access to all [features](/platform/quickstart/ui-vs-cli) of the Zapier Platform
* Ability to better optimize your code. Move shared logic into modules. Leverage middleware to centralize request & response processing.
* Easier team collaboration. You'll be able to check all the code for your Zapier integration into your team's source control repo.
* Set up automated regression tests, to catch errors each time you push a change.
To export your existing Platform UI integration to Platform CLI:
## 1. Install and configure the Zapier CLI on your development environment
Follow the steps in the setup section in our [quickstart guide](/platform/reference/cli-docs#quick-setup-guide)
## 2. Run the `convert` command to create a CLI version of your project locally
Create a new directory for your Zapier project and from the command line `cd` into it. Then run:
`zapier convert {your integration id} . --version={integration version you want to convert}`
Your integration ID can be found in the browser location bar in the Platform UI:
Similarly, your version can be found there, and elsewhere throughout the Platform UI:
Using this example, to create our project in the current directory our command would be:
`zapier convert 1234 . --version=1.0.0`
## 3. Explore your new CLI project and get familiar with the tool
Check out the resources available in the [CLI section](/platform/reference/cli-docs) of the docs to learn all about the Zapier CLI.
If you need a refresher on JavaScript, it's well worth the time to check out some of the many great resources available [online](https://javascript.info/). The Zapier Platform uses promises pretty heavily, so this is a good JavaScript topic to get familiar with.
## 4. Deploy
When you ran convert and created your new local CLI project, it was automatically associated with your Zapier integration (using the `.zapierapprc` file).
A couple of important notes before deploying:
* When you push the CLI project to the server it will create a *new version* of your integration. If you haven't gotten familiar with how versions work you might take a moment and learn about those [here](/platform/manage/versions).
* Take a look at the version number in your `package.json` file. When you created your project with the `convert` tool we automatically incremented the version you converted. You can change this to a different version number depending on your needs, but make sure a version with that number doesn't already exist in your integration. Run `zapier versions` from your project directory to see what's already been created.
* Integrations converted with the `zapier convert` command will include `convertedByCLIVersion` in the `package.json` for informational purposes.
When you're ready to deploy your CLI version run:
`zapier-platform push`
When that completes you'll be able to see the new version in the Platform UI in the Manage > Versions section, and will be able to make Zaps with your new CLI-built version.
You will not be able to edit your new CLI-built version from the *Build* section of the Platform UI, the attributes of this version will all [show a lock icon](https://cdn.zappy.app/f048ffc4c905bcbb332e344ce0ce52ba.png).
You can still use all the other functions of the Platform UI, though, including version management, embed management and your Partner Dashboard. Your earlier versions, created within the Platform UI, are also still available and can still be edited and used.
If you decide that the Platform CLI is not for you, you can delete your new version from Manage > Versions and continue where you left off in the Platform UI.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/manage/export-ui.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Export integration to Platform UI
> The Zapier Platform UI is the easiest way for anyone with API experience to build Zapier integrations. It is for users more comfortable with a visual form editor.
Some advanced calls and response parsing can still be performed in the Platform UI when using [Code Mode](/platform/build/code-mode).
The Platform UI has the following advantages over the CLI:
* A graphic user-interface with form-based editor.
* A live form preview that shows how changes made to your integration would appear in the Zap editor.
If you have an integration in the Platform CLI that you would like to edit in the Platform UI instead, you can create a new version in the Platform UI.
When moving an app from CLI to the Platform UI, we cannot migrate users from previous versions or apps. Existing users will be able to continue using the version they're on, but must upgrade to the new version manually. Existing users would see this [prompt in the Zap editor](https://help.zapier.com/hc/en-us/articles/18755649454989-Update-to-the-latest-app-version-in-Zaps) to optionally encourage them to make the update.
Zapier does not automatically notify all existing users of a new version's availability, but new users would only see the currently promoted/Public version when searching for the app name. We also recommend announcing the changes/new integration version to your general user base via in-app or email marketing to encourage users to switch over.
To export your existing Platform CLI integration to Platform UI:
## 1. Contact Developer Support to create an empty version of your integration
Hiding an app and replacing it with a new app ID built in the preferred tool is [not supported](/platform/publish/integration-publishing-requirements#23-replacement-integration). To export your Platform CLI integration to the Platform UI, contact the [Developer Support](https://developer.zapier.com/contact) team to create an empty version associated with the same app ID.
## 2. Rebuild the integration from scratch
Rebuild the integration from scratch on this newly created empty version in the Platform UI and ensure that this new version has feature parity to the previous CLI version. This new version can then be maintained in the Platform UI by your team. For [Public apps](/platform/quickstart/private-vs-public-integrations), this avoids a repeat of the app review process; as well as retaining previous versions, associated bug reports and feature requests.
> Allow users to remain on the (now legacy) CLI version until they switch over manually, as long as the endpoints are functional. If [Deprecation](/platform/manage/deprecate) is necessary, please note this is significantly more disruptive to our mutual users and should be considered carefully.
When the conversion has been completed, you will be able to see this version and the previous CLI versions in the Platform UI's **Manage > Versions** section.
While you can see the previous CLI versions in the Platform UI, you would not be able edit those versions there. The previous CLI versions would show a lock icon on the various attributes under the *Build* section as they can only be edited from the CLI environment.
You can however, manage the integration, set up and manage embeds (for public integrations) and view the partner dashboard for the integration from the Platform UI.
***
*Need help? [Tell us about your problem](https://developer.zapier.com/contact) and we'll connect you with the right resource or contact support.*
---
# Source: https://docs.zapier.com/platform/build-cli/faqs.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Frequently Asked Questions
### Why doesn't Zapier support newer versions of Node.js?
We run your code on AWS Lambda, which only supports a few [versions](https://docs.aws.amazon.com/lambda/latest/dg/programming-model.html) of Node. Sometimes that doesn't include the latest version. Additionally, with thousands of integrations running on the Zapier platform, we have to be sure upgrading to the latest Node version will not have a negative impact.
### How do I manually set the Node.js version to run my integration with?
Update your `zapier-platform-core` dependency in `package.json`. Each major version ties to a specific version of Node.js. You can find the mapping [here](https://github.com/zapier/zapier-platform/blob/main/packages/cli/src/version-store.js). We only support the version(s) supported by [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/programming-model.html).
**IMPORTANT CAVEAT:** AWS periodically deprecates Node versions as they reach EOL. They announce this [on their blog](https://aws.amazon.com/blogs/developer/node-js-6-is-approaching-end-of-life-upgrade-your-aws-lambda-functions-to-the-node-js-10-lts/). Similar info and dates are available on [github](https://github.com/nodejs/Release). Well before this date, we'll have a version of `core` that targets the newer Node version.
If you don't upgrade before the cutoff date, there's a chance that AWS will throw an error when attempting to run your integration's code. If that's the case, we'll instead run it under the oldest Node version still supported. All that is to say, **we may run your code on a newer version of Node.js than you intend** if you don't update your integration's dependencies periodically.
### Does Zapier support XML (SOAP) APIs?
Not natively, but it can! Users have reported that the following `npm` modules are compatible with the CLI Platform:
* [pixl-xml](https://github.com/jhuckaby/pixl-xml)
* [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js)
* [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser)
Since core v10, it's possible for [shorthand requests](/platform/build-cli/overview#shorthand-http-requests) to parse XML. Use an `afterResponse` [middleware](/platform/build-cli/overview#using-http-middleware) that sets `response.data` to the parsed XML:
```js theme={null}
const xml = require("pixl-xml");
const App = {
// ...
afterResponse: [
(response, z, bundle) => {
// Only works on core v10+!
response.throwForStatus();
response.data = xml.parse(response.content);
return response;
},
],
// ...
};
```
### What's the deal with pagination? When is it used and how does it work?
Moved to [paging](/platform/build-cli/overview#paging).
### How does deduplication work?
Each time a polling Zap runs, Zapier extracts a unique "primary key" for each item in the response. Zapier needs to decide which of the items should trigger the Zap. To do this, we compare the primary keys to all those we've seen before, trigger on new objects, and update the list of seen primary keys. When a Zap is turned on, we initialize the list of seen primary keys with a single poll. When it's turned off, we clear that list. For this reason, it's important that calls to a polling endpoint always return the newest items.
For example, the initial poll returns objects 4, 5, and 6 (where a higher primary key is newer). If a later poll increases the limit and returns objects 1-6, then 1, 2, and 3 will be (incorrectly) treated like new objects.
By default, the primary key is the item's `id` field. Since v15.6.0, you can customize the primary key by setting `primary` to true in `outputFields`.
There's a more in-depth explanation [here](/platform/build/deduplication).
### Why are my triggers complaining if I don't provide an explicit `id` field?
For deduplication to work, we need to be able to identify and use a unique field. In older, legacy Zapier Web Builder integrations, we guessed if `id` wasn't present. In order to ensure we don't guess wrong, we now require that the developers send us an `id` field. If your objects have a differently-named unique field, feel free to adapt this snippet and ensure this test passes:
```js theme={null}
// ...
let items = response.data.items; // or response.json.items if you're using core v9 or older
return items.map((item) => {
item.id = item.contactId;
return item;
});
```
Since v15.6.0, instead of using the default `id` field, you can also define one or more `outputFields` as `primary`. For example:
```js theme={null}
{
triggers: {
recipe: {
operation: {
outputField: [
{ key: "userId", primary: true },
{ key: "slug", primary: true },
{ key: "name" },
];
}
}
}
}
```
will tell Zapier to use `(userId, slug)` as the unique primary key to deduplicate items when running a polling trigger.
**Limitation:** The `primary` option currently doesn't support mixing top-level fields with nested fields that use double underscores in their keys. For example, if you set `primary: true` on both `id` and `user__id`, the `primary` setting on the `user__id` field will be ignored; only `id` will be used for deduplication. However, if all the `primary` fields are all nested, such as `user__id` + `user__name`, it will work as expected.
### Node X No Longer Supported
If you're seeing errors like the following:
```
InvalidParameterValueException An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: The runtime parameter of nodejs6.10 is no longer supported for creating or updating AWS Lambda functions. We recommend you use the new runtime (nodejsX.Y) while creating or updating functions.
```
... then you need to update your `zapier-platform-core` dependency to a non-deprecated version that uses a newer version of Node.js. Complete the following instructions as soon as possible:
1. Edit `package.json` to depend on a later major version of `zapier-platform-core`. There's a list of all breaking changes (marked with a :exclamation:) in the corresponding changelog in [Platform News](/platform/news).
2. Increment the `version` property in `package.json`
3. Ensure you're using version `v18` (or greater) of node locally (`node -v`). Use [nvm](https://github.com/nvm-sh/nvm) to use a different one if need be.
4. Run `rm -rf node_modules && npm i` to get a fresh copy of everything
5. Run `zapier-platform test` (or deprecated `zapier test`) to ensure your tests still pass
6. Run `zapier-platform push` (or deprecated `zapier push`)
7. Run `zapier-platform promote YOUR_NEW_VERSION` (or deprecated `zapier promote YOUR_NEW_VERSION`) (from step 2)
8. Migrate your users from the previous version (`zapier migrate OLD_VERSION YOUR_NEW_VERSION`)
### What Analytics are Collected?
Starting with v8.4.0, Zapier collects information about each invocation of the CLI tool.
This data is collected purely to improve the CLI experience and will **never** be used for advertising or any non-product purpose. There are 3 collection modes that are set on a per-computer basis.
**Anonymous**
When you run a command with analytics in `anonymous` mode, the following data is sent to Zapier:
* which command you ran
* if that command is a known command
* how many arguments you supplied (but not the contents of the arguments)
* which flags you used (but not their contents)
* the version of CLI that you're using
* the integration app the CLI commands are run in
**Enabled** (the default)
When analytics are fully `enabled`, the above is sent, plus:
* your operating system (the result of calling [`process.platform`](https://nodejs.org/api/process.html#process_process_platform))
* your Zapier user id
**Disabled**
Lastly, analytics can be `disabled` entirely, either by running `zapier analytics --mode disabled` or setting the `DISABLE_ZAPIER_ANALYTICS` environment variable to `1`.
We take great care not to collect any information about your filesystem or anything otherwise secret. You can see exactly what's being collecting at runtime by prefixing any command with `DEBUG=zapier:analytics`.
### What's the Difference Between an "App" and an "Integration"?
We're in the process of doing some renaming across our Zapier marketing terms. Eventually we'll use "integration" everywhere. Until then, know that these terms are interchangeable and describe the code that you write that connects your API to Zapier.
### What does performGet do?
The `performGet` method is an optional feature in Zapier that allows you to retrieve detailed information about an object. For instance, if your `create` action's `perform` method only returns the new object's `ID`, you can use `performGet` to fetch the object's full properties using that `ID`.
`performGet` is only available for `Create` or `Search` actions and is most useful when the initial `perform` result is limited, and additional information is needed.
The results from `perform` are automatically passed to `performGet` via `bundle.inputData` each time the `create` or `search` runs, allowing you to retrieve more comprehensive details.
It's important to note that `performGet` is only invoked when the result returned by `perform` is not empty.
---
# Source: https://docs.zapier.com/platform/build/field-definitions.md
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zapier.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Field types
Three types of fields exist for users to see in the Zap editor:
* Input fields
* Dynamic fields
* Line item groups
## Input fields
Input fields are most commonly used and include 9 types that look and act differently in the Zap editor. Depending on the type, users can either enter plain text data, make a selection or map variables from previous triggers and actions. Zapier does not validate the data to ensure users added the correct item for that field type.
### String
The default input field, which accepts text input. Typically used to gather individual text values such as a name or email address.
{" "}
{" "}
### Text
Displays large, `