Findings — where documentation and file disagree
Each finding states a defect in the source material, shows the
verbatim evidence, and links to the automated check that re-verifies it at
every ingest. Internal corroborations appear as INT-nn keys only —
the content stays off this site by design (why).
G1 — The collection's Quick Start describes auth machinery the file does not contain high
The collection description tells a new developer to authenticate using an
Authentication folder and collection-level authorization. Neither
exists in the file. There is no auth block, no pre-request script, no
Authentication folder, and the only defined collection variable is baseUrl —
clientId and clientSecret are referenced but never defined.
A developer following the Quick Start verbatim cannot authenticate: every one
of the 14 requests would return 401 Unauthorized.
This claim is re-verified automatically at every ingest — see check G1 on the methodology page. If a corrected collection is ever shipped, this finding's evidence table updates itself.
The gap is recoverable, because the real OAuth 2.0 configuration lives in the public Onboarding Guide (see Lesson 1):
| Setting | Value |
|---|---|
| Auth URL | https://auth.app.iwave.com/oauth2/authorize/ |
| Access Token URL | https://auth.app.iwave.com/oauth2/token/ |
| Refresh Token URL | https://auth.app.iwave.com/oauth2/token/ |
| Scope | https://api.app.iwave.com/integration |
| Header prefix | Bearer |
Note that auth.app.iwave.com is a different host from the API's
api.app.iwave.com — and the collection defines no variable for it.
Evidence
**Authenticate**: Run a login request from the Authentication folder. The `accessToken` will auto-populate.
**Execute**: Collection-level authorization will automatically apply your Bearer token to all requests.
**Configure Variables**: In your Collection Variables, set `baseUrl` (choose the US or Canadian server), `clientId`, and `clientSecret`.
Auth URL: https://auth.app.iwave.com/oauth2/authorize/
Internal source — content not shown publicly.
G2 — Saved example data is schema-shaped but semantically incoherent medium
The 28 saved response examples were generated from the schema's types without semantic constraints. Audited automatically at every ingest (see methodology, checks G2a–G2c):
- 16 of 28
capacityRangeLow/capacityRangeHighpairs are inverted — e.g.low=8967, high=219. - All 12
agevalues are humanly impossible (4012,7722,9631…). List ProjectsshowstotalRows: 6141, validRows: 7799— more valid rows than rows.
What this means for you: the examples are authoritative for structure (field names, nesting, types, status codes) and useless for meaning. This site therefore labels every displayed value as either Tier A — source-verbatim or Tier B — authored illustration, and never mixes them silently.
One real signal survives the noise: every score field observed
(capacityScore, affinityScore, propensityScore, rfmScore, …) falls in
0–4 across all 28 examples. That consistency across otherwise random data
almost certainly reflects a genuine schema bound. It is, however, an
inference — the only one this site makes — and is labelled as such
wherever it appears (audit check INF1).
Evidence
"age": 4012
"capacityRangeLow": 9611, "capacityRangeHigh": 6367,
"totalRows": 6141, "validRows": 7799,
G3 — CSV upload is documented, but the CSV schema is absent medium
Step 2 of the bulk lifecycle says CSV upload is supported and points the
reader at "the text/csv schema" for column headings. That schema is not in
the collection: no request declares a text/csv content type, and no CSV
example exists anywhere in the file.
Practical consequence: you cannot determine the column headings from the collection alone. Until confirmed, use the JSON array form of Step 2 — its schema is fully specified by the request body example. The authoritative OpenAPI specification likely resolves this (internal corroboration: INT-03).
Evidence
The use of CSV files is supported as well by using the `Content-Type` and `Accept` headers `text/csv`. Refer to the `text/csv` `schema` for appropriate column heading structure.
Internal source — content not shown publicly.
G4 — scoreConfiguration affinity codes are an undocumented vocabulary low
Step 1's optional scoreConfiguration block takes affinity codes:
the example shows "primaryAffinity": "DIS" described as "Science" and
"secondaryAffinity": "AGR" described as "Human Services - Basic/Emergency
Aid". Two codes of an unknown-size vocabulary; no list exists anywhere in the
collection, and the codes are not mnemonic.
Mitigating: the collection itself recommends omitting the block, so most integrations never need the vocabulary.
The profile response's additionalData.donations object contains 29 named
sector fields (arts, educationHigher, science…). Whether those
correspond to the affinity vocabulary is unverified — a plausible
hypothesis this site deliberately does not state as fact.
Evidence
**Note**: The `scoreConfiguration` section of the request is purely optional and not recommended for most use cases. Omitting it will have the Screening Batch use the Score Settings configured within the iWave appliation.
G5 — Five endpoints return arrays; only one is paginated medium
List Profiles takes page and itemsPerPage. The other four
array-returning endpoints — List Projects, Step 5: Retrieve Scored
Profiles, its deprecated alternate, and Step 6: Retrieve Project Errors —
take no pagination parameters at all.
Step 1 advertises projects of up to 1,000,000 records. An unpaginated
GET /project/:id/profiles over such a project implies an enormous single
response. Whether pagination is undocumented-but-supported or genuinely absent
cannot be determined from the collection — this site flags it as an open
question rather than asserting either way.
Also unstated: any maximum for itemsPerPage (both query parameters carry
null descriptions in the file).
Evidence
Creates a new project container. Supports up to 1,000,000 records per batch.
{{baseUrl}}/integrations/20240515/profile?page=1&itemsPerPage=30
G6 — Two incompatible error envelopes — with a type flip inside one endpoint medium
The 4xx examples use two distinct shapes:
RFC 7807-style (profile 404, score-request 404, project status/process 404):
{ "title": "An error occured", "detail": "", "status": "404", "type": "/errors/404" }
(typo "occured" is in the source; status is a string)
Simple code/message (profile 400, Steps 2/3/6 404):
{ "code": 404, "message": "" }
(code is an integer)
Worse, within Create Screening Project alone the 400 example carries
"status": 400 as an integer while the sibling 404 carries "status": "404"
as a string.
Lesson: never bind a single error model. Parse defensively — try both shapes, and treat the numeric field as either string or int.
Evidence
{ "title": "An error occured", "detail": "", "status": "404", "type": "/errors/404" }
{ "code": 403, "message": "The requested project is not in a state that allows this request." }
"status": 400,