Zeffy Payments API

An organization's transactions and donations.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/zeffy-payments-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

zeffy-payments-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Zeffy Public Campaigns Payments API
  description: 'The Zeffy Public API gives nonprofit organization admins free, read-only access to their Zeffy data: Payments (transactions/donations), Contacts (donors and supporters), and Campaigns (donation forms, events, and other campaign types). The API is REST over HTTPS, authenticated with a per-organization API key sent as a Bearer token in the Authorization header. It is read-only - records can be pulled but not created or modified. Results use cursor-based pagination and support filtering (payments by currency, status, type, contact, campaign, and date range; contacts by ID or email). The rate limit is 100 requests per minute per API key.

    NOTE: The list endpoints (GET /payments, GET /contacts, GET /campaigns), the base URL, Bearer auth, cursor pagination, and the rate limit are confirmed from Zeffy''s public documentation. The get-by-id paths and individual query parameters below are honestly modeled from the documented capabilities ("look up a specific payment", "look up a specific person by ID or email", filter by currency/status/type/contact/campaign/date) rather than copied field-by-field from the interactive reference, which requires an account.'
  version: '1.0'
  contact:
    name: Zeffy
    url: https://www.zeffy.com/integration/api
servers:
- url: https://api.zeffy.com/api/v1
  description: Zeffy Public API
security:
- bearerAuth: []
tags:
- name: Payments
  description: An organization's transactions and donations.
paths:
  /payments:
    get:
      operationId: listPayments
      tags:
      - Payments
      summary: List payments
      description: Lists an organization's payments. Filterable by currency, status, type, contact, campaign, and date range. Confirmed endpoint.
      parameters:
      - name: currency
        in: query
        required: false
        schema:
          type: string
        description: Filter by currency (e.g. USD, CAD).
      - name: status
        in: query
        required: false
        schema:
          type: string
        description: Filter by payment status.
      - name: type
        in: query
        required: false
        schema:
          type: string
          enum:
          - online
          - manual
          - imported
        description: Filter by payment type.
      - name: contactId
        in: query
        required: false
        schema:
          type: string
        description: Filter by contact.
      - name: campaignId
        in: query
        required: false
        schema:
          type: string
        description: Filter by campaign.
      - name: startDate
        in: query
        required: false
        schema:
          type: string
          format: date
        description: Start of the date range.
      - name: endDate
        in: query
        required: false
        schema:
          type: string
          format: date
        description: End of the date range.
      - name: cursor
        in: query
        required: false
        schema:
          type: string
        description: Cursor for the next page (next_cursor from a prior response).
      responses:
        '200':
          description: A page of payments.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentList'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /payments/{id}:
    get:
      operationId: getPayment
      tags:
      - Payments
      summary: Get a payment
      description: Retrieves a single payment, including line items, refund details, buyer info, and a link to the tax receipt. Modeled from the documented ability to look up a specific payment.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: A single payment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    PaymentList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Payment'
        has_more:
          type: boolean
        next_cursor:
          type: string
          nullable: true
    Payment:
      type: object
      description: A transaction/donation. Field set is modeled.
      properties:
        id:
          type: string
        currency:
          type: string
        status:
          type: string
        type:
          type: string
          enum:
          - online
          - manual
          - imported
        amount:
          type: number
        contactId:
          type: string
        campaignId:
          type: string
        createdAt:
          type: string
          format: date-time
        lineItems:
          type: array
          items:
            type: object
        refund:
          type: object
          nullable: true
        taxReceiptUrl:
          type: string
          format: uri
          nullable: true
  responses:
    RateLimited:
      description: Rate limit exceeded (100 requests per minute per API key).
    Unauthorized:
      description: Missing or invalid API key.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Per-organization API key generated under Settings then Integrations, sent as "Authorization: Bearer YOUR_API_KEY".'