curl --request GET \
--url https://api.getbreezyapp.com/v1/reports/revenue-attribution \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getbreezyapp.com/v1/reports/revenue-attribution"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getbreezyapp.com/v1/reports/revenue-attribution', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"period_start": "2026-08-01",
"period_end": "2026-09-01",
"currency": "USD",
"group": {
"dimension": "team_member",
"value": null,
"label": null
},
"job_count": 1,
"sold_credit_count": 1,
"earned_credit_count": 0,
"sold_revenue_cents": 0,
"earned_revenue_cents": 0
},
{
"period_start": "2026-08-01",
"period_end": "2026-09-01",
"currency": "USD",
"group": {
"dimension": "team_member",
"value": "11111111-1111-4111-8111-000000000401",
"label": "Alex Example"
},
"job_count": 1,
"sold_credit_count": 1,
"earned_credit_count": 1,
"sold_revenue_cents": 100000,
"earned_revenue_cents": 100000
}
],
"pagination": {
"next_cursor": null
},
"meta": {
"request_id": "11111111-1111-4111-8111-000000009999",
"generated_at": "2026-09-08T19:00:00Z",
"timezone": "America/Los_Angeles"
},
"report": {
"start_date": "2026-08-01",
"end_date": "2026-09-01",
"bucket": "month",
"group_by": "team_member",
"date_basis": "WORK_COMPLETED"
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "end_date must be later than start_date",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "A valid API key is required",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "METHOD_NOT_ALLOWED",
"message": "This resource supports GET",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "STALE_REVISION",
"message": "The visit changed; read it again before editing",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "Request body exceeds 64 KB",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Request limit exceeded",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Unable to complete request",
"request_id": "example-request",
"details": []
}
}Summarize recorded sold and earned credits by member
Company-local work-completion date with no fallback. Fixed credited-member grouping; unavailable members share a null group. Separate saved sold/earned cents and credit counts, plus distinct contributing job count. Filters select credits. No invoice-payment, assignment or costing eligibility requirement. Member credits overlap; sold and earned are separate measures, not additive company revenue. Rows order by period_start then member ID, null first; empty buckets omitted and periods clipped to the request.
curl --request GET \
--url https://api.getbreezyapp.com/v1/reports/revenue-attribution \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getbreezyapp.com/v1/reports/revenue-attribution"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getbreezyapp.com/v1/reports/revenue-attribution', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"period_start": "2026-08-01",
"period_end": "2026-09-01",
"currency": "USD",
"group": {
"dimension": "team_member",
"value": null,
"label": null
},
"job_count": 1,
"sold_credit_count": 1,
"earned_credit_count": 0,
"sold_revenue_cents": 0,
"earned_revenue_cents": 0
},
{
"period_start": "2026-08-01",
"period_end": "2026-09-01",
"currency": "USD",
"group": {
"dimension": "team_member",
"value": "11111111-1111-4111-8111-000000000401",
"label": "Alex Example"
},
"job_count": 1,
"sold_credit_count": 1,
"earned_credit_count": 1,
"sold_revenue_cents": 100000,
"earned_revenue_cents": 100000
}
],
"pagination": {
"next_cursor": null
},
"meta": {
"request_id": "11111111-1111-4111-8111-000000009999",
"generated_at": "2026-09-08T19:00:00Z",
"timezone": "America/Los_Angeles"
},
"report": {
"start_date": "2026-08-01",
"end_date": "2026-09-01",
"bucket": "month",
"group_by": "team_member",
"date_basis": "WORK_COMPLETED"
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "end_date must be later than start_date",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "A valid API key is required",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "METHOD_NOT_ALLOWED",
"message": "This resource supports GET",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "STALE_REVISION",
"message": "The visit changed; read it again before editing",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "Request body exceeds 64 KB",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Request limit exceeded",
"request_id": "example-request",
"details": []
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "Unable to complete request",
"request_id": "example-request",
"details": []
}
}Authorizations
Existing Breezy API key. Grants all published reads and scheduling writes in its associated company. No app permission scopes.
Query Parameters
Maximum parent records or report rows. Complete children are always included.
1 <= x <= 100Repeat the original filters; any valid page size may continue. Foreign-company, tampered or mismatched cursors return INVALID_CURSOR.
1Inclusive company-local date.
Exclusive company-local date; must be after start_date.
day, week, month, quarter, year SERVICE, MAINTENANCE, ESTIMATE_REPAIR, ESTIMATE_REPLACE, INSTALL, WARRANTY, CALLBACK, SALES, UNKNOWN, null A currently validated credited company member.
SOLD, EARNED, null Response
Successful read. Clients ignore unrecognized response fields.