Kindsight Integrations API teaching reference · v20240515 · unofficial
Every endpoint, parameter and response here is extracted programmatically from the Postman collection — nothing is retyped. Quotes are verbatim; values are labelled Tier A · source-verbatim or Tier B · authored illustration. How this was built →

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 baseUrlclientId 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.
S1 Collection description, 'Postman Quick Start'
**Execute**: Collection-level authorization will automatically apply your Bearer token to all requests.
S1 Collection description, 'Postman Quick Start'
**Configure Variables**: In your Collection Variables, set `baseUrl` (choose the US or Canadian server), `clientId`, and `clientSecret`.
S1 Collection description, 'Postman Quick Start' — but only `baseUrl` is defined in the file
Auth URL: https://auth.app.iwave.com/oauth2/authorize/
S2 Onboarding Guide, Step 2: Receiving Your Credentials

Internal source — content not shown publicly.

S5 INT-02 Corroboration from an internal source

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/capacityRangeHigh pairs are inverted — e.g. low=8967, high=219.
  • All 12 age values are humanly impossible (4012, 7722, 9631…).
  • List Projects shows totalRows: 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
S1 Saved example 'Profile Retrieved Successfully', GET /profile/:id
"capacityRangeLow": 9611, "capacityRangeHigh": 6367,
S1 Saved example 'Score Retrieved Successfully', GET /score-request/:id
"totalRows": 6141, "validRows": 7799,
S1 Saved example 'List of Projects Retrieved', GET /project

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.
S1 Request description, Step 2: Add Individuals to be screened to Project

Internal source — content not shown publicly.

S3 INT-03 Location of the OpenAPI specification

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.
S1 Request description, Step 1: Create Screening Project (typo 'appliation' is in the source)

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.
S1 Request description, Step 1: Create Screening Project
{{baseUrl}}/integrations/20240515/profile?page=1&itemsPerPage=30
S1 Raw URL, List Profiles — the only array endpoint with pagination

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" }
S1 Saved example 'Profile/Project not found', multiple endpoints
{ "code": 403, "message": "The requested project is not in a state that allows this request." }
S1 Saved example 'Forbidden', Step 3: Initiate Project Processing
"status": 400,
S1 Saved example 'Bad request', Step 1: Create Screening Project — integer here, string in the 404