From persona-pack
Creates Persona identity verification inquiries using Python REST API calls, generates hosted/embedded URLs, polls status, and retrieves results. For API testing and basic flows.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin persona-packThis skill is limited to using the following tools:
Create a Persona inquiry, generate an embed URL for the verification flow, and poll for the inquiry status. Uses the real Persona REST API with sandbox credentials.
Builds KYC verification flow using Persona API: creates inquiries via backend endpoint, embeds UI in web apps, handles completion callbacks.
Guides building custom QA agent personalities for project-specific testing via prompts on specialty, tools, scenarios; generates and registers skill files.
Guides preparation for DPA inspections with document checklists, interview prep for personnel, technical demo procedures, on-site logistics, response protocols, and follow-up. Useful for GDPR compliance during audits or investigations.
Share bugs, ideas, or general feedback.
Create a Persona inquiry, generate an embed URL for the verification flow, and poll for the inquiry status. Uses the real Persona REST API with sandbox credentials.
persona-install-auth setupitmpl_*)import os, requests
API_KEY = os.environ["PERSONA_API_KEY"]
BASE = "https://withpersona.com/api/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Persona-Version": "2023-01-05",
"Content-Type": "application/json",
}
# Create a new inquiry from a template
resp = requests.post(f"{BASE}/inquiries", headers=HEADERS, json={
"data": {
"attributes": {
"inquiry-template-id": "itmpl_YOUR_TEMPLATE_ID",
"reference-id": "user-12345", # Your internal user ID
}
}
})
resp.raise_for_status()
inquiry = resp.json()["data"]
inquiry_id = inquiry["id"]
status = inquiry["attributes"]["status"]
print(f"Inquiry created: {inquiry_id} (status: {status})")
# The inquiry includes a session token for the embedded flow
session_token = inquiry["attributes"].get("session-token")
if session_token:
# Option A: Hosted flow (redirect user to Persona)
hosted_url = f"https://withpersona.com/verify?inquiry-id={inquiry_id}&session-token={session_token}"
print(f"Send user to: {hosted_url}")
# Option B: Embedded flow (JavaScript SDK in your page)
print(f"Embed with: Persona.Client({{ templateId: 'itmpl_...', inquiryId: '{inquiry_id}' }})")
import time
for _ in range(30): # Poll for up to 5 minutes
resp = requests.get(f"{BASE}/inquiries/{inquiry_id}", headers=HEADERS)
resp.raise_for_status()
status = resp.json()["data"]["attributes"]["status"]
print(f" Status: {status}")
if status in ("completed", "approved", "declined"):
break
time.sleep(10)
# Get verification details
if status == "completed":
verifications = resp.json()["data"]["relationships"]["verifications"]["data"]
for v in verifications:
print(f" Verification: {v['type']} — {v['id']}")
# Get detailed verification result
verification_id = verifications[0]["id"]
v_resp = requests.get(f"{BASE}/verifications/{verification_id}", headers=HEADERS)
v_resp.raise_for_status()
v_data = v_resp.json()["data"]["attributes"]
print(f" Check: {v_data['status']}")
print(f" Name: {v_data.get('name-first', 'N/A')} {v_data.get('name-last', 'N/A')}")
| Error | Cause | Solution |
|---|---|---|
422 Unprocessable | Invalid template ID | Verify template ID in Dashboard |
Inquiry stays created | User hasn't started flow | Share the hosted URL with user |
| Empty verifications | Inquiry not completed | Wait for user to complete verification |
404 Not Found | Wrong inquiry ID | Check ID format: inq_* |
persona-core-workflow-apersona-webhooks-events