Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.
/api/v1/redact returns the masked text only. There's no encrypted envelope, no decryption material, no way to recover the original values. Use it for analytics, logs, and prompts that the LLM doesn't need to un-mask.

Try it live

Paste a mk_live_… key below (it stays in this browser only and is sent as a Bearer header, never as a cookie), then run a real /redact call. You'll get back the redacted text and a per-type count of distinct values.
Try it · /api/v1/redact
87 chars
Set your API key in the bar above to run this.
Copy as
The static SDK snippets below are the same flow in code; copy whichever language you need.

When to use redact vs mask

  • Mask when you'll send the result to an LLM and need to recover PII before showing the user the LLM's response.
  • Redact when you only need to display, log, or analyze the text; no recovery needed.

The call

import requests resp = requests.post( "https://api.kindi.me/api/v1/redact", headers={"Authorization": "Bearer mk_live_..."}, json={"text": "Call John Doe at +966 50 123 4567"}, ).json() print(resp["redacted_text"]) # → "Call PERSON_NAME_01 at PHONE_01" print(resp["entity_counts"]) # → {"PERSON_NAME": 1, "PHONE": 1}

The full response body

{ "redacted_text": "Call PERSON_NAME_01 at PHONE_01", "pii_count": 2, "entity_counts": {"PERSON_NAME": 1, "PHONE": 1}, "request_id": "redact_9f21ac0e", "processing_time_ms": 38, "judge_used": false }
pii_count counts distinct values, not occurrences, and entity_counts is keyed by redact placeholder prefix. See the /redact reference for every field.
Placeholders are stable within a single request; PERSON_NAME_01 refers to the same person every time it appears in redacted_text. Across requests, numbering restarts at _01.