openapi: 3.0.3 info: title: Classy API (GoFundMe Pro) Authentication Recurring Donation Plans API description: 'The Classy API is a resource-oriented REST API for the Classy online fundraising platform (rebranding to GoFundMe Pro). It exposes Organizations, Campaigns, Fundraising Pages, Fundraising Teams, Transactions, Recurring Donation Plans, Members, Supporters, and Designations, among other resources, under a versioned base path (https://api.classy.org/2.0). Authentication uses OAuth2 client credentials: POST client_id/client_secret/grant_type as a JSON body to /oauth2/auth to receive a Bearer access_token. List endpoints return a Laravel-style pagination envelope (current_page, data, per_page, total, next_page_url, etc.) and support a `with` query parameter to eager-load related sub-resources (for example ?with=items or ?with=source_tracking_codes). This document models the endpoints confirmed against the official classy-org/classy-node resource map and the official classy-org/postman-collections examples; the full resource surface is broader (52+ resource types) and is documented in full only behind Classy/GoFundMe Pro developer credentials. Endpoint coverage: endpointsConfirmed - a curated set of the most-used endpoints across Organizations, Campaigns, Fundraising Pages, Fundraising Teams, Transactions, Recurring Donation Plans, Members, Supporters, and Designations, grounded in classy-org/classy-node''s src/resources.json and classy-org/postman-collections examples. endpointsModeled - request/response shapes for those endpoints, inferred from the Postman collection example bodies (field names, types, and the pagination envelope) since Classy does not publish a machine-readable OpenAPI/Swagger document.' version: '2.0' contact: name: Classy (GoFundMe Pro) url: https://www.classy.org servers: - url: https://api.classy.org/2.0 description: Classy / GoFundMe Pro production API security: - bearerAuth: [] tags: - name: Recurring Donation Plans description: Sustainer / recurring donation subscriptions. paths: /recurring-donation-plans/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getRecurringDonationPlan tags: - Recurring Donation Plans summary: Retrieve a recurring donation plan responses: '200': description: The requested recurring donation plan. content: application/json: schema: $ref: '#/components/schemas/RecurringDonationPlan' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: operationId: updateRecurringDonationPlan tags: - Recurring Donation Plans summary: Update a recurring donation plan requestBody: required: true content: application/json: schema: type: object additionalProperties: true responses: '200': description: The updated recurring donation plan. content: application/json: schema: $ref: '#/components/schemas/RecurringDonationPlan' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationError' /recurring-donation-plans/{id}/transactions: parameters: - $ref: '#/components/parameters/Id' - $ref: '#/components/parameters/With' get: operationId: listRecurringDonationPlanTransactions tags: - Recurring Donation Plans summary: List a recurring donation plan's transactions description: Supports ?with=items, confirmed against the official "Fetch Multi-Item Order" Postman collection. responses: '200': description: A paginated list of transactions. content: application/json: schema: $ref: '#/components/schemas/TransactionPage' '401': $ref: '#/components/responses/Unauthorized' components: parameters: Id: name: id in: path required: true description: The numeric ID of the resource. schema: type: integer With: name: with in: query required: false description: Comma-separated list of related sub-resources to eager-load, e.g. items, source_tracking_codes, organization, member. schema: type: string schemas: Transaction: type: object description: Field names confirmed against the official "Fetch Multi-Item Order" Postman collection example response. properties: id: type: integer campaign_id: type: integer organization_id: type: integer fundraising_page_id: type: integer nullable: true fundraising_team_id: type: integer nullable: true supporter_id: type: integer status: type: string enum: - success - pending - failed - refunded billing_first_name: type: string billing_last_name: type: string billing_address1: type: string billing_city: type: string billing_state: type: string billing_postal_code: type: string billing_country: type: string card_type: type: string card_last_four: type: integer charged_at: type: string format: date-time charged_currency_code: type: string charged_total_gross_amount: type: number classy_fees_amount: type: number total_gross_amount: type: number comment: type: string acknowledgements_count: type: integer items: type: array items: $ref: '#/components/schemas/TransactionItem' updated_at: type: string format: date-time additionalProperties: true Error: type: object properties: error: type: string error_description: type: string permissions: type: array items: type: object properties: action: type: string entity: type: string TransactionItem: type: object properties: id: type: integer transaction_id: type: integer type: type: string description: e.g. donation, ticket, merchandise, fee. donation_gross_amount: type: number donation_net_amount: type: number campaign_id: type: integer fundraising_page_id: type: integer nullable: true organization_id: type: integer raw_final_price: type: number currency_code: type: string promo_code_id: type: integer nullable: true additionalProperties: true RecurringDonationPlan: type: object properties: id: type: integer campaign_id: type: integer member_id: type: integer status: type: string enum: - active - paused - cancelled frequency: type: string description: e.g. monthly, weekly, annually. raw_amount: type: number currency_code: type: string next_charge_date: type: string format: date created_at: type: string format: date-time updated_at: type: string format: date-time additionalProperties: true PaginationEnvelope: type: object properties: current_page: type: integer first_page_url: type: string from: type: integer last_page: type: integer last_page_url: type: string next_page_url: type: string nullable: true path: type: string per_page: type: integer prev_page_url: type: string nullable: true to: type: integer total: type: integer TransactionPage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/Transaction' responses: ValidationError: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing, invalid, or expired Bearer token. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' securitySchemes: bearerAuth: type: http scheme: bearer description: 'OAuth2 client_credentials access token obtained from POST /oauth2/auth. Passed as `Authorization: Bearer {access_token}`.'