openapi: 3.0.3 info: title: Classy API (GoFundMe Pro) Authentication Organizations 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: Organizations description: Nonprofit organization records and their nested collections. paths: /organizations/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getOrganization tags: - Organizations summary: Retrieve an organization responses: '200': description: The requested organization. content: application/json: schema: $ref: '#/components/schemas/Organization' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /organizations/{id}/campaigns: parameters: - $ref: '#/components/parameters/Id' - $ref: '#/components/parameters/With' get: operationId: listOrganizationCampaigns tags: - Organizations summary: List an organization's campaigns responses: '200': description: A paginated list of campaigns. content: application/json: schema: $ref: '#/components/schemas/CampaignPage' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createOrganizationCampaign tags: - Organizations summary: Create a campaign for an organization requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CampaignInput' responses: '200': description: The created campaign. content: application/json: schema: $ref: '#/components/schemas/Campaign' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /organizations/{id}/designations: parameters: - $ref: '#/components/parameters/Id' get: operationId: listOrganizationDesignations tags: - Organizations summary: List an organization's designations responses: '200': description: A paginated list of designations. content: application/json: schema: $ref: '#/components/schemas/DesignationPage' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createOrganizationDesignation tags: - Organizations summary: Create a designation for an organization requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/DesignationInput' responses: '200': description: The created designation. content: application/json: schema: $ref: '#/components/schemas/Designation' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /organizations/{id}/fundraising-pages: parameters: - $ref: '#/components/parameters/Id' - $ref: '#/components/parameters/With' get: operationId: listOrganizationFundraisingPages tags: - Organizations summary: List an organization's fundraising pages responses: '200': description: A paginated list of fundraising pages. content: application/json: schema: $ref: '#/components/schemas/FundraisingPagePage' '401': $ref: '#/components/responses/Unauthorized' /organizations/{id}/supporters: parameters: - $ref: '#/components/parameters/Id' get: operationId: listOrganizationSupporters tags: - Organizations summary: List an organization's supporters responses: '200': description: A paginated list of supporters. content: application/json: schema: $ref: '#/components/schemas/SupporterPage' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createOrganizationSupporter tags: - Organizations summary: Create a supporter for an organization requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SupporterInput' responses: '200': description: The created supporter. content: application/json: schema: $ref: '#/components/schemas/Supporter' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /organizations/{id}/transactions: parameters: - $ref: '#/components/parameters/Id' - $ref: '#/components/parameters/With' get: operationId: listOrganizationTransactions tags: - Organizations summary: List an organization's transactions description: Supports ?with=items to eager-load transaction line items, matching the official "Fetch Multi-Item Order" Postman collection example. responses: '200': description: A paginated list of transactions. content: application/json: schema: $ref: '#/components/schemas/TransactionPage' '401': $ref: '#/components/responses/Unauthorized' /organizations/{id}/recurring-donation-plans: parameters: - $ref: '#/components/parameters/Id' get: operationId: listOrganizationRecurringDonationPlans tags: - Organizations summary: List an organization's recurring donation plans responses: '200': description: A paginated list of recurring donation plans. content: application/json: schema: $ref: '#/components/schemas/RecurringDonationPlanPage' '401': $ref: '#/components/responses/Unauthorized' /organizations/{id}/source-tracking-codes: parameters: - $ref: '#/components/parameters/Id' - name: fundraisingTeams in: query schema: type: boolean - name: fundraisingPages in: query schema: type: boolean - name: transactions in: query schema: type: boolean get: operationId: listOrganizationSourceTrackingCodes tags: - Organizations summary: List an organization's source tracking codes description: Confirmed against the official classy-org/postman-collections "Fetch Source Codes" example. Optional flags control whether fundraising teams, fundraising pages, and transactions attributed to each code are included. responses: '200': description: A list of source tracking codes. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/SourceTrackingCode' '401': $ref: '#/components/responses/Unauthorized' components: schemas: SupporterInput: type: object properties: first_name: type: string last_name: type: string email_address: type: string format: email phone: type: string additionalProperties: true 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 DesignationInput: type: object required: - name properties: name: type: string description: type: string active: type: boolean 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 Supporter: allOf: - $ref: '#/components/schemas/SupporterInput' - type: object properties: id: type: integer organization_id: type: integer member_id: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time CampaignPage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/Campaign' SourceTrackingCode: type: object description: Confirmed against the official "Fetch Source Codes" Postman collection example. properties: id: type: integer campaign_id: type: integer code: type: string source: type: string medium: type: string fundraising_teams: type: array items: type: object additionalProperties: true fundraising_pages: type: array items: type: object additionalProperties: true transactions: type: array items: type: object additionalProperties: true additionalProperties: true DesignationPage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/Designation' FundraisingPagePage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/FundraisingPage' Designation: allOf: - $ref: '#/components/schemas/DesignationInput' - type: object properties: id: type: integer organization_id: type: integer campaign_id: type: integer nullable: true raw_current_amount: type: number created_at: type: string format: date-time updated_at: type: string format: date-time Error: type: object properties: error: type: string error_description: type: string permissions: type: array items: type: object properties: action: type: string entity: type: string RecurringDonationPlanPage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/RecurringDonationPlan' CampaignInput: type: object required: - name - type properties: name: type: string type: type: string description: Campaign type, e.g. donation, peer_to_peer, crowdfunding, event, ticketed_event. goal: type: number currency_code: type: string started_at: type: string format: date-time ended_at: type: string format: date-time additionalProperties: true 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 FundraisingPage: allOf: - $ref: '#/components/schemas/FundraisingPageInput' - type: object properties: id: type: integer campaign_id: type: integer fundraising_team_id: type: integer nullable: true status: type: string url: type: string raw_current_amount: type: number created_at: type: string format: date-time updated_at: type: string format: date-time Campaign: allOf: - $ref: '#/components/schemas/CampaignInput' - type: object properties: id: type: integer organization_id: type: integer status: type: string raw_current_raised_amount: type: number created_at: type: string format: date-time updated_at: type: string format: date-time Organization: type: object properties: id: type: integer name: type: string currency_code: type: string status: type: string website_url: type: string created_at: type: string format: date-time updated_at: type: string format: date-time additionalProperties: true FundraisingPageInput: type: object required: - title properties: title: type: string goal: type: number story: type: string member_id: type: integer additionalProperties: true SupporterPage: allOf: - $ref: '#/components/schemas/PaginationEnvelope' - type: object properties: data: type: array items: $ref: '#/components/schemas/Supporter' 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: NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing, invalid, or expired Bearer token. content: application/json: schema: $ref: '#/components/schemas/Error' ValidationError: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' parameters: 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 Id: name: id in: path required: true description: The numeric ID of the resource. schema: type: integer securitySchemes: bearerAuth: type: http scheme: bearer description: 'OAuth2 client_credentials access token obtained from POST /oauth2/auth. Passed as `Authorization: Bearer {access_token}`.'