> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tapify.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Subscribe to contact events

> Register a Zapier hook for new or updated Tapify contacts.

Use this endpoint for a Zapier REST Hook trigger. To set up a Zap without writing code, follow [Connect Tapify with Zapier](https://docs.tapify.app/teams/integrations/zapier.md).

Send `contact.created` or `contact.updated` as `eventType`, together with the `targetUrl` supplied by Zapier.

> [!NOTE]
>
> The destination must be an HTTPS URL on `hooks.zapier.com`, without a username, password, or URL fragment. This endpoint accepts Zapier hooks only.

## Save the subscription ID

The response is a plain object containing `id`, with no `data` wrapper. Store this ID to [unsubscribe](https://docs.tapify.app/api-reference/zapier/unsubscribe.md) later.

Repeating the request with the same workspace, event type, and URL returns the existing subscription ID. It also associates that subscription with the API key used for the request.

## Event payloads

Tapify sends a contact object directly to the Zapier hook when the selected event occurs. There is no `data` wrapper or `eventType` field in that object.

* **New contact:** `id` is the contact ID.
* **Updated contact:** `id` combines the contact ID and update timestamp. `contactId` contains the original contact ID for other API requests.

Contact details can include internal notes and submitted messages. Only send them to a Zapier workflow that should have access to that data.

## Delivery and access

Build your workflow to handle repeated deliveries. Temporary failures can be retried; delivery is not guaranteed. A `410 Gone` response from Zapier removes the subscription.

> [!WARNING]
>
> Deleting the API key removes its subscriptions. Reconnect or resubscribe workflows when replacing a key. The workspace also needs Teams Connect access for delivery.


## OpenAPI

````yaml api-reference/openapi.json POST /zapier/subscriptions
openapi: 3.0.3
info:
  title: Tapify API
  version: 1.0.0
  description: >-
    Read and manage saved contacts, team members, and their digital business
    cards in one Tapify Teams workspace. Requires Teams Connect access and a
    workspace API key.
servers:
  - url: https://tapify.app/api/v1
    description: Tapify API
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: Workspace
    description: Check the workspace connected to an API key.
  - name: Team members
    description: Manage members and their digital business cards.
  - name: Contacts
    description: Manage contacts collected across the workspace.
  - name: Zapier
    description: >-
      Endpoints used by the Tapify Zapier integration for trigger samples and
      REST Hook subscriptions.
paths:
  /zapier/subscriptions:
    post:
      tags:
        - Zapier
      summary: Subscribe to contact events
      description: >-
        Register a Zapier REST Hook. Only hooks.zapier.com HTTPS URLs are
        accepted. Repeating the same workspace, event type, and URL returns the
        existing ID and associates it with the API key used for this request.
        Request body limit: 8 KiB (8,192 bytes).
      operationId: subscribeZapierContactEvents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ZapierSubscriptionRequest'
            example:
              eventType: contact.created
              targetUrl: https://hooks.zapier.com/hooks/standard/123456/example/
      responses:
        '201':
          description: Subscription created or reused. The response has no data wrapper.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ZapierSubscriptionResponse'
              example:
                id: 1f84ece7-9acc-4abd-8ce1-925b2a5df17d
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/SubscriptionRequired'
        '413':
          $ref: '#/components/responses/ZapierPayloadTooLarge'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    ZapierSubscriptionRequest:
      type: object
      required:
        - eventType
        - targetUrl
      properties:
        eventType:
          $ref: '#/components/schemas/ZapierContactEventType'
        targetUrl:
          type: string
          format: uri
          maxLength: 2048
          description: >-
            Zapier destination: an HTTPS URL on hooks.zapier.com with no
            username, password, or fragment.
          example: https://hooks.zapier.com/hooks/standard/123456/example/
    ZapierSubscriptionResponse:
      type: object
      required:
        - id
      description: The subscription ID, returned directly with no data wrapper.
      properties:
        id:
          type: string
          format: uuid
          description: Store this ID to unsubscribe.
          example: 1f84ece7-9acc-4abd-8ce1-925b2a5df17d
    ZapierContactEventType:
      type: string
      enum:
        - contact.created
        - contact.updated
      description: The Tapify contact event used by this Zapier trigger.
    ErrorResponse:
      type: object
      description: Information about a request that Tapify could not complete.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Short code that identifies the error.
              example: bad_request
            message:
              type: string
              description: Readable explanation of what went wrong.
              example: Request body is invalid.
            details:
              type: object
              description: Extra information that can help fix the request.
              additionalProperties: true
              nullable: true
  responses:
    BadRequest:
      description: The request JSON, a required field, or a parameter is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: bad_request
              message: fullName is required.
    Unauthorized:
      description: The API key is missing, incorrect, or deleted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: invalid_api_key
              message: API key is invalid or revoked.
    SubscriptionRequired:
      description: >-
        The workspace needs Teams Connect access. Check its plan, subscription
        status, and trial expiry.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: subscription_required
              message: Tapify Teams Connect is required for this feature.
    ZapierPayloadTooLarge:
      description: The JSON request is larger than 8 KiB (8,192 bytes).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: payload_too_large
              message: Request body is too large.
    RateLimited:
      description: Too many requests were sent in a short period.
      headers:
        Retry-After:
          description: Seconds to wait before trying again.
          schema:
            type: integer
            example: 30
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: rate_limited
              message: Rate limit exceeded.
              details:
                retryAfter: 30
    InternalError:
      description: Tapify could not complete the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: internal_error
              message: Something went wrong.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Tapify API key
      description: API key created under Settings → API keys.
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Alternative to Authorization: Bearer. Send one authentication method per
        request; a Bearer token takes priority.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.