Skip to main content

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).

ResourceAnswers
GET /v1/click/reports/acceptancesOne row per template version: outcomes, distinct signers, current signers.
POST /v1/click/reports/acceptances/queryThe same report for one signer.
GET /v1/click/reports/currencyOne 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 }
}
  • signers counts distinct signer references with an accepted acceptance of that version. A declined or expired acceptance never makes a signer.
  • currentSigners counts 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.
  • erasedAcceptances counts accepted acceptances whose signer identity was erased. They are never counted in signers or currentSigners, and never merged into one signer.
  • servedBy lists the deployments that serve this version's major. graceEndsAt is 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​

  • 400 for a missing window, a window over 366 days, an unknown filter, or signerRef on a URL.
  • 403 without click:read.
  • 404 for a template or version that is not in your organization.
  • 503 when 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.