# Zapier

The Nifty app for [Zapier](https://zapier.com/apps/nifty/integrations) lets a
Zap read and write your Nifty workspace without code. It runs on the v3 API, so
everything a Zap does is a v3 call made as the member who connected it.

This page is for people who build or maintain Zaps and for developers who want
to know what the app does on the wire. For step-by-step help setting up a Zap,
see the [Help Center](https://help.niftypm.com).

## How the connection works

Connecting Nifty in Zapier is the
[OAuth 2.1 authorization-code flow with PKCE](/authorization): Zapier sends you
to Nifty, you sign in, **pick the workspace**, and approve. The Zap then acts as
you.

- **A connection is one member in one workspace.** It is labelled
  `<your name> (<workspace>)`. To use a second workspace, add a second
  connection.
- **Access is clamped to your role.** The app asks for the access it needs, and
  Nifty grants only what your role in that workspace allows, now and on every
  refresh. A step that needs more than your role has fails with a permission
  error (`403`); it is not a bug. Ask a workspace admin to run the Zap, or to
  change your role.
- **Everything the Zap writes is attributed to you.** Tasks it creates,
  comments it posts and files it attaches show you as the author.
- **Reconnect if the connection is revoked.** Removing the app in Nifty, being
  removed from the workspace, or a revoked grant stops the connection. Zapier
  then shows *"Your Nifty connection has expired or was revoked"* on the next
  run, and you reconnect from the Zap's app connection settings.

Each connection is one OAuth grant and therefore one token, so a Zap's requests
count against that token's [rate limits](/rate-limits) and no one else's.

## Triggers

Triggers start a Zap. These three **poll**: Zapier asks Nifty for the newest
items every few minutes (how often depends on your Zapier plan) and starts the
Zap once for each item it has not seen.

| Trigger | Starts when | Options |
| --- | --- | --- |
| **New Task** | A task or subtask is created. Archived tasks are not reported. | Project |
| **Task Completed** | A task is marked complete. | Project |
| **New Project** | A project is created in the workspace. | None |

Leaving **Project** empty means every project you can access. Each check looks
at the 50 most recent items, so a burst of more than 50 new tasks between two
checks can skip some. Task outputs include the task's web URL, and custom field
values appear as `Custom Field: <name>`.

Instant triggers, which fire the moment something changes, are planned. Until
they ship you can build the same thing yourself with a [webhook](/webhooks).

### At-least-once

Treat every trigger as **at-least-once**: a Zap can occasionally start twice
for the same item, for example when two polls overlap or after a retry. Zapier
de-duplicates polling triggers by the item's `id`, which removes almost all of
it, but build Zaps that tolerate a repeat:

- Prefer steps that are safe to run twice, such as **Update Task**, **Complete
  Task** or **Set Custom Field Value**, over steps that add something each time,
  such as **Add Comment**.
- Put **Find Task** (or a **Find or Create** step) in front of any step that
  creates something, so a repeat finds the existing item instead of making a
  second one.
- **Task Completed** reports a task once. A task that is reopened and completed
  again does not start the Zap a second time.

## Actions

| Action | What it does |
| --- | --- |
| **Create Task** | Creates a task in a project, optionally on a list and status, with assignees (members or emails), labels, dates and custom fields. |
| **Create Subtask** | Creates a subtask under an existing task, in the parent's project. |
| **Update Task** | Changes the name, description, start date or due date. Only the fields you fill in change. |
| **Complete Task** / **Reopen Task** | Marks a task completed, or not completed again. |
| **Move Task to Status** | Moves a task to another status column of its project. |
| **Assign Member to Task** / **Unassign Member From Task** | Adds or removes assignees (chosen from the list or given by email), keeping the others. |
| **Add Label to Task** / **Remove Label From Task** | Adds or removes labels, keeping the others. |
| **Set Custom Field Value on Task** | Sets one custom field. Values are text: `true` or `false` for a checkbox, an option name for a dropdown. An empty value clears the field. |
| **Add Comment to Task** | Posts a comment in the task's discussion as the connected member. |
| **Attach File to Task** | Attaches a file from an earlier step or a public `http`/`https` URL, which Nifty fetches. |
| **Add Checklist Items to Task** | Creates a new checklist on the task with one item per line. |
| **Archive Task** | Archives a task. It is hidden from boards and lists, not deleted, and can be restored in Nifty. |
| **Create Project** | Creates a project, optionally in a portfolio and with members. You become its owner. |
| **Create List** | Creates a list in a project, optionally as a milestone with start and end dates. |
| **Create Status** | Adds a status column to a project's board. |
| **Create Label** | Creates a label. Label names are unique in a workspace, so creating an existing name fails. |

Description fields accept Nifty markdown.
Task actions take a **Task ID**; get it from a trigger or from **Find Task**.

## Searches

A search step finds an existing item so later steps can use its ID. Each returns
the item, with its URL where it has one.

| Search | Finds by |
| --- | --- |
| **Find Task** | Task ID, exact name, or the value of a custom field. Returns matches newest first. |
| **Find Project** | Exact name. Archived projects are skipped. |
| **Find Member** | Email address. Returns the member ID to use when assigning tasks. |
| **Find List** | Exact name, within a project. Archived lists are skipped. |
| **Find Status** | Exact name, within a project. Archived statuses are skipped. |
| **Find Label** | Exact name. |

**Find or Create** is available for **Task**, **Project**, **Label** and
**List**: it runs the search and, when nothing matches, the matching create
action.

## Existing Zaps and the move to v3

Earlier versions of the app (2.0.x) used the v1 API, which stops serving
requests on 1 September 2027. Nifty is moving existing Zaps to this version in
stages through Zapier's migration tooling, so most connections need nothing from
you:

- **Zaps keep working.** The steps they already use stay available to them, with
  the same fields and outputs. They are hidden from the step picker for new
  Zaps; new Zaps get the steps above.
- **Connections carry over.** A connection that is in use keeps working without
  reconnecting. One that has sat unused for a long time, for example the
  connection behind a Zap that was never switched on, may ask you to reconnect
  the next time it runs.
- **Three behaviours differ.** Messages sent by the old message step post as the
  connected member, and the bot name and icon fields are ignored. Doc content is
  now Nifty markdown. And a migrated polling Zap may start once for up to 25
  recent items it had not seen before, because the first check after the move
  has no memory of the earlier ones.

Versions 1.x of the app signed in with a Nifty email and password. They cannot be
migrated: reconnect with the current app as described in the Help Center.

## Where to get help

- **[Help Center](https://help.niftypm.com)**: setting up a Zap, and the
  reconnect guide for connections from the earlier app.
- **[team@niftypm.com](mailto:team@niftypm.com)**: a connection that will not
  authorize, or a step that behaves differently from this page.
- **[Webhooks](/webhooks)** and **[API reference](/api/v3)**: when a Zap is not
  the right tool.
