Acceptance reports
Two read-only resources answer "how far has our re-acceptance campaign got?" without exporting every acceptance.
Both need a click:read token (click:admin also works).
| Resource | Answers |
|---|---|
GET /v1/click/reports/acceptances | One row per template version: outcomes, distinct signers, current signers. |
POST /v1/click/reports/acceptances/query | The same report for one signer. |
GET /v1/click/reports/currency | One row per deployment: how many known signers are current or stale. |
Acceptances per version
from and to are required, inclusive, and at most 366 days apart.
templateId, versionId and environment (default PRODUCTION) narrow the report.
Lists page as the rest of the API does (page, limit up to 100, default 20).
{
"reports": [
{
"templateId": "6f1c3a42-8a8e-4e53-b8c4-0b6a3f2f9d11",
"templateName": "Report terms",
"versionId": "a93e5c10-2d47-4b0a-9a55-6d0f0e5c7b21",
"version": "2.0.0",
"major": 2,
"versionLabel": "Major 2.0.0: terms wording",
"environment": "PRODUCTION",
"accepted": 5,
"declined": 1,
"expired": 1,
"signers": 2,
"currentSigners": 2,
"erasedAcceptances": 3,
"servedBy": [
{
"deploymentId": "41aa0b7e-9d62-4e5c-8f10-3c2b7a9d5e44",
"servedVersion": "2.0.0",
"servedMajor": 2,
"revision": 2,
"graceEndsAt": null
}
]
}
],
"pagination": { "total": 2, "page": 1, "limit": 20, "hasMore": false }
}
signerscounts distinct signer references with an accepted acceptance of that version. A declined or expired acceptance never makes a signer.currentSignerscounts those signers who are current on at least one deployment of the template in the environment. "Current" is the rule of signer status: the signer ever accepted a major the deployment serves, grace window included. A version of an older major can therefore have current signers, when they also accepted the major now served.erasedAcceptancescounts accepted acceptances whose signer identity was erased. They are never counted insignersorcurrentSigners, and never merged into one signer.servedBylists the deployments that serve this version's major.graceEndsAtis set when only a superseded revision still serves it.
One signer
A signer reference in a URL reaches load-balancer logs, so signerRef on the GET form is a 400.
To report on one signer, send the same filters as a body to POST /v1/click/reports/acceptances/query:
curl -X POST https://api.propper.ai/v1/click/reports/acceptances/query \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "from": "2026-01-01T00:00:00Z", "to": "2026-06-30T23:59:59Z", "signerRef": "customer-4821" }'
Current and stale per deployment
GET /v1/click/reports/currency?templateId=...&environment=PRODUCTION returns one row per deployment:
{
"deployments": [
{
"deploymentId": "41aa0b7e-9d62-4e5c-8f10-3c2b7a9d5e44",
"templateId": "6f1c3a42-8a8e-4e53-b8c4-0b6a3f2f9d11",
"environment": "PRODUCTION",
"servedVersion": "2.0.0",
"servedMajor": 2,
"revision": 2,
"knownSigners": 5,
"current": 2,
"stale": 3,
"erasedAcceptances": 3,
"graceEndsAt": null
}
],
"pagination": { "total": 1, "page": 1, "limit": 20, "hasMore": false }
}
stale is knownSigners minus current.
Signers who never accepted cannot be counted: Propper does not know your population.
Errors and caching
400for a missing window, a window over 366 days, an unknown filter, orsignerRefon a URL.403withoutclick:read.404for a template or version that is not in your organization.503when the report is temporarily unavailable.
Every response, errors included, is Cache-Control: private, no-store.
Reports share the per-client rate limits of the rest of the Click API.