Skip to content
cursareDocs
Sign inGet started
Documentation
  • Overview
  • Index2
  • Organization17
  • Sales6
  • Insights8
  • Reports and safety7
  • Minor accounts8
  • Minor safety3
  • Offers11
  • Media1
  • Contents10
  • Learner delivery1
  • Learner runtime5
  • Learners12
  • Cohorts12
  • Intake forms5
  • Campaigns4
  • Teams8
  • Affiliates7
  • Links7
  • Reviews1
  • Integrations26
  • MCP2
  • Webhooks6

Sales

Purchases, revenue, payouts and refunds.

6 endpoints

Sales totals

GET/sales

Per-content sales totals, net of refunds. Revenue is keyed by currency — never sum across currencies. Every figure is the price paid by buyers. Use getPayouts for the corresponding course-payment transfers.

Responses

200Sales totals.
401Missing, invalid or revoked API key.
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/sales \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "byContent": [
      {
        "contentId": "string",
        "currency": "string",
        "purchases": 0,
        "revenue": 0,
        "slug": "string"
      }
    ],
    "revenueByCurrency": {},
    "totalPurchases": 0
  }
}

Refund a purchase

POST/purchases/{id}/refund

Persists the refund workflow, issues a full refund on the selling organization's connected Stripe account, revokes access, and marks the purchase refunded only after provider confirmation. Idempotent retries never refund twice.

Path parameters

idstring

The purchase id.

Responses

200Refund a purchase.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/purchases/{id}/refund \
  --request POST \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "amount": 0,
    "id": "string",
    "refunded": true
  }
}

List purchases

GET/purchases

The org's purchase ledger, newest first and paginated. Read-only — to refund a purchase, call POST /purchases/{id}/refund.

Query parameters

contentIdstring

Only purchases of this content.

fromdate

Only purchases made on or after this ISO date.

pageinteger
pageSizeinteger
statusenum

Filter by ledger status.

paidrefundedpast_duecanceled

todate

Only purchases made on or before this ISO date.

userIdstring

Only purchases by this Cursare user.

Responses

200List purchases.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/purchases \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "page": 0,
    "pageSize": 0,
    "purchases": [
      {
        "amount": 0,
        "buyerCountry": "string",
        "buyerEmail": "string",
        "buyerLegalName": "string",
        "buyerName": "string",
        "buyerTaxId": "string",
        "buyerTaxIdType": "string",
        "contentId": "string",
        "contentTitle": "string",
        "contractSnapshot": {
          "accessTerms": "string",
          "amount": 0,
          "contentTitle": "string",
          "currency": "string",
          "installmentAmounts": [
            0
          ],
          "offerName": "string",
          "termsVersion": 0,
          "withdrawalDays": 0
        },
        "createdAt": "2026-01-31T12:00:00.000Z",
        "currency": "string",
        "id": "string",
        "installments": 0,
        "learnerEmail": "string",
        "learnerName": "string",
        "learnerUserId": "string",
        "refundedAmount": 0,
        "refundedAt": "2026-01-31T12:00:00.000Z",
        "refundKind": "withdrawal",
        "refundReason": "string",
        "refundRequestedAt": "2026-01-31T12:00:00.000Z",
        "refundResolutionReason": "string",
        "refundResolvedAt": "2026-01-31T12:00:00.000Z",
        "refundStatus": "requested",
        "sellerSnapshot": {
          "address": {
            "city": "string",
            "country": "string",
            "line1": "string",
            "postalCode": "string",
            "region": "string",
            "line2": "string"
          },
          "legalName": "string",
          "supportEmail": "learner@example.com",
          "supportPhone": "string",
          "supportUrl": "string",
          "taxId": "string",
          "taxIdType": "br_cpf"
        },
        "status": "paid",
        "userId": "string",
        "withdrawalEligibleUntil": "2026-01-31T12:00:00.000Z"
      }
    ],
    "total": 0
  }
}

Get a purchase

GET/purchases/{id}

One ledger row, org-scoped. Read-only — to refund it, call POST /purchases/{id}/refund.

Path parameters

idstring

The purchase id.

Responses

200Get a purchase.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/purchases/{id} \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "amount": 0,
    "buyerCountry": "string",
    "buyerEmail": "string",
    "buyerLegalName": "string",
    "buyerName": "string",
    "buyerTaxId": "string",
    "buyerTaxIdType": "string",
    "contentId": "string",
    "contentTitle": "string",
    "contractSnapshot": {
      "accessTerms": "string",
      "amount": 0,
      "contentTitle": "string",
      "currency": "string",
      "installmentAmounts": [
        0
      ],
      "offerName": "string",
      "termsVersion": 0,
      "withdrawalDays": 0
    },
    "createdAt": "2026-01-31T12:00:00.000Z",
    "currency": "string",
    "id": "string",
    "installments": 0,
    "learnerEmail": "string",
    "learnerName": "string",
    "learnerUserId": "string",
    "refundedAmount": 0,
    "refundedAt": "2026-01-31T12:00:00.000Z",
    "refundKind": "withdrawal",
    "refundReason": "string",
    "refundRequestedAt": "2026-01-31T12:00:00.000Z",
    "refundResolutionReason": "string",
    "refundResolvedAt": "2026-01-31T12:00:00.000Z",
    "refundStatus": "requested",
    "sellerSnapshot": {
      "address": {
        "city": "string",
        "country": "string",
        "line1": "string",
        "postalCode": "string",
        "region": "string",
        "line2": "string"
      },
      "legalName": "string",
      "supportEmail": "learner@example.com",
      "supportPhone": "string",
      "supportUrl": "string",
      "taxId": "string",
      "taxIdType": "br_cpf"
    },
    "status": "paid",
    "userId": "string",
    "withdrawalEligibleUntil": "2026-01-31T12:00:00.000Z"
  }
}

List a content's purchases

GET/contents/{id}/purchases

The purchase ledger of one content, newest first and paginated. Read-only — to refund a purchase, call POST /purchases/{id}/refund.

Path parameters

idstring

The content id.

Query parameters

fromdate

Only purchases made on or after this ISO date.

pageinteger
pageSizeinteger
statusenum

Filter by ledger status.

paidrefundedpast_duecanceled

todate

Only purchases made on or before this ISO date.

userIdstring

Only purchases by this Cursare user.

Responses

200List a content's purchases.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/contents/{id}/purchases \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "page": 0,
    "pageSize": 0,
    "purchases": [
      {
        "amount": 0,
        "buyerCountry": "string",
        "buyerEmail": "string",
        "buyerLegalName": "string",
        "buyerName": "string",
        "buyerTaxId": "string",
        "buyerTaxIdType": "string",
        "contentId": "string",
        "contentTitle": "string",
        "contractSnapshot": {
          "accessTerms": "string",
          "amount": 0,
          "contentTitle": "string",
          "currency": "string",
          "installmentAmounts": [
            0
          ],
          "offerName": "string",
          "termsVersion": 0,
          "withdrawalDays": 0
        },
        "createdAt": "2026-01-31T12:00:00.000Z",
        "currency": "string",
        "id": "string",
        "installments": 0,
        "learnerEmail": "string",
        "learnerName": "string",
        "learnerUserId": "string",
        "refundedAmount": 0,
        "refundedAt": "2026-01-31T12:00:00.000Z",
        "refundKind": "withdrawal",
        "refundReason": "string",
        "refundRequestedAt": "2026-01-31T12:00:00.000Z",
        "refundResolutionReason": "string",
        "refundResolvedAt": "2026-01-31T12:00:00.000Z",
        "refundStatus": "requested",
        "sellerSnapshot": {
          "address": {
            "city": "string",
            "country": "string",
            "line1": "string",
            "postalCode": "string",
            "region": "string",
            "line2": "string"
          },
          "legalName": "string",
          "supportEmail": "learner@example.com",
          "supportPhone": "string",
          "supportUrl": "string",
          "taxId": "string",
          "taxIdType": "br_cpf"
        },
        "status": "paid",
        "userId": "string",
        "withdrawalEligibleUntil": "2026-01-31T12:00:00.000Z"
      }
    ],
    "total": 0
  }
}

List connected-account payments

GET/payouts

Every provider-verified direct course payment on the organization's connected Stripe account, newest first. Installment plans produce one fact per paid invoice. No Cursare transfer is created. Amounts are in the currency's minor unit (cents).

Query parameters

limitinteger

Responses

200List connected-account payments.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/payouts \
  --header 'Authorization: Bearer cr_live_…'
{
  "data": {
    "payouts": [
      {
        "amount": 0,
        "availableAt": "2026-01-31T12:00:00.000Z",
        "createdAt": "2026-01-31T12:00:00.000Z",
        "currency": "string",
        "providerAccountReference": "string",
        "providerPaymentReference": "string"
      }
    ],
    "totals": [
      {
        "amount": 0,
        "currency": "string"
      }
    ]
  }
}

Your privacy choices

The technical Tag Manager container is required to apply your choices. Analytics and marketing cookies and storage remain optional and stay off until you authorize them. Privacy Policy.

Sign-in, security, core functions and consent enforcement.

Audience measurement such as Google Analytics.

Marketing storage, campaign attribution and optional tags.