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.
How this skill is triggered — by the user, by Claude, or both
Slash command
/persona-pack:persona-hello-worldThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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-eventsnpx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin persona-packBuilds KYC verification flow using Persona API: creates inquiries via backend endpoint, embeds UI in web apps, handles completion callbacks.
Guided builder that creates custom QA agent personalities for project-specific testing needs. Defines specialty, tools, and test scenarios, then generates a personality skill file.
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.