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
paths:
  /v2/promotions:
    post:
      operationId: root_create
      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.
      summary: Create a promotion enrollment
      tags:
        - Promotions
        - Experimental
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PromotionEnrollment'
            examples:
              EnrollInAPromotion:
                value:
                  promotion_id: promo_12345
                summary: Enroll in a promotion
        required: true
      security:
        - OAuth:
            - promotions:write
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromotionEnrollmentResponse'
          description: Successful Enrollment
        '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: ''
        '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
        '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'
  /v2/promotions/{enrollment_id}:
    get:
      operationId: root_retrieve
      description: |-
        Retrieve promotion enrollment details by enrollment ID.

        Endpoint available to Partners only.
        The request must be authenticated by a user access token
        that the user has granted to the Partner for the account.

        #### OAuth

        This endpoint requires the `promotions:read` OAuth scope.
      parameters:
        - in: path
          name: enrollment_id
          schema:
            type: string
          required: true
      tags:
        - Promotions
        - Experimental
      security:
        - OAuth:
            - promotions:read
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PromotionDetail'
              examples:
                GetPromotionDetails:
                  value:
                    promotion_id: test_promo
                    enrollment_date: '2026-04-28T00:00:00Z'
                    expiration_date: '2026-07-26T23:59:59Z'
                    task_limit_per_month: 5
                    tasks_used_this_month: 0
                    status: enrolled
                  summary: Get Promotion Details
          description: Succcessful retrieval of promotion details
        '404':
          description: No response body
        '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: ''
        '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
        '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'
    delete:
      operationId: root_destroy
      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.
      parameters:
        - in: path
          name: enrollment_id
          schema:
            type: string
          required: true
      tags:
        - Promotions
        - Experimental
      security:
        - OAuth:
            - promotions:write
      responses:
        '204':
          description: No response body
        '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: ''
        '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
        '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'
components:
  schemas:
    PromotionDetail:
      type: object
      description: Succcessful retrieval of promotion details
      properties:
        promotion_id:
          type: string
          description: The unique identifier for the promotion
        enrollment_date:
          type:
            - string
            - 'null'
          format: date-time
          description: Date and time of enrollment
        expiration_date:
          type:
            - string
            - 'null'
          format: date-time
          description: Date and time when the promotion expires
        task_limit_per_month:
          type:
            - integer
            - 'null'
          description: Maximum number of tasks allowed per monthly billing cycle
        tasks_used_this_month:
          type: integer
          description: Number of tasks already used this monthly billing cycle (may not align with calendar month)
        status:
          type: string
          description: Current status of the enrollment
      required:
        - enrollment_date
        - expiration_date
        - promotion_id
        - status
        - task_limit_per_month
        - tasks_used_this_month
    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
    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
    PromotionErrorResponse:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/PromotionError'
          description: Errors encountered processing the request
      required:
        - errors
  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
servers:
  - url: https://api.zapier.com
    description: Production
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
