engaging-networks-api — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited engaging-networks-api (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<objective> Enables Claude to build, debug, optimize, and deploy integrations with the Engaging Networks REST API for nonprofit fundraising data access. </objective>
<essential_principles>
<authentication_overview> The Engaging Networks REST API provides programmatic access to fundraising pages, supporter data, and campaign metrics for nonprofit organizations.
Session-based authentication (two-step process):
ens-auth-token header for all subsequent requestsTwo token types:
</authentication_overview>
<rate_limits_overview> Hard limits:
Best practices:
</rate_limits_overview>
<regional_instances> EN has multiple deployments - use the correct one:
https://us.engagingnetworks.app/ens/servicehttps://us2.engagingnetworks.app/ens/servicehttps://ca.engagingnetworks.app/ens/serviceNote: EU and AU clients currently use the CA servers (ca.engagingnetworks.app). There are no separate eu. or au. endpoints at this time. If your organization was provisioned under an EU or AU label, use the CA base URL.
Check your EN admin panel URL to determine your region. </regional_instances>
<data_model> Core entities:
Typical integration flow:
</data_model>
<error_handling_overview> Retry on:
Don't retry:
</error_handling_overview>
<data_privacy> This skill is a development assistant. Its primary purpose is helping you write, debug, and deploy code that uses the EN API — not acting as a live data operations proxy.
Recommended: use a sandbox or test EN account. All workflows work without real donor data.
Data flow awareness: When the agent executes EN API calls, response data is processed by the model provider's infrastructure (Anthropic, OpenAI, etc.). Any supporter PII in API responses — names, emails, addresses, donation history — is transferred to a third party during inference. Read operations expose PII even though they don't modify data.
Payment data restriction: Never route credit card data through the agent. The -vault host variant for payment processing must only be used in direct server-to-EN connections in application code, not through agent sessions.
If connecting to a production account: query only what you need, avoid bulk supporter retrieval through the agent, inform your organization's data protection officer, and clear conversation history after working with live donor data. See SECURITY.md in the repository root for full guidance. </data_privacy>
<write_safety> The EN API has endpoints that modify production nonprofit donor data. Treat write operations with the same care as database migrations.
Risk classification:
Before executing any WRITE or DESTRUCTIVE API call:
WRITE endpoints: POST /supporter, PUT /supporter/{id}, PUT /supporter/bulk, POST /page/{id}/process, POST/PUT /supporter/{id}/originsource, PUT /supporter/{id}/transactions/recurring/{txnId}, POST/PUT/DELETE /supporter/importformat, POST /ma/{id}/supporter/bulk
DESTRUCTIVE endpoints: DELETE /supporter/{id}, DELETE /supporter/{id}/originsource, DELETE /supporter/importformat/{id}
When generating client code, always include a dryRun option on write methods so users can preview what would be sent without actually executing it. See references/typescript-client.md for the pattern. </write_safety>
</essential_principles>
<intake> Before we begin: Are you working with a sandbox/test account or a production account?
What would you like to do?
Wait for response, then route to appropriate workflow. </intake>
<routing>
| Response | Workflow |
|---|---|
| 1, "new", "create", "build", "start", "integration" | workflows/build-integration.md |
| 2, "add", "endpoint", "new endpoint", "extend" | workflows/add-endpoint.md |
| 3, "debug", "broken", "error", "401", "429", "auth", "connection" | workflows/debug-api-issues.md |
| 4, "optimize", "slow", "rate limit", "cache", "reduce calls" | workflows/optimize-api-usage.md |
| 5, "supporters", "query", "create supporter", "update supporter" | workflows/add-endpoint.md (supporter service group) |
| 6, "transactions", "donations", "recurring", "payments" | workflows/add-endpoint.md (transaction service group) |
| 7, "components", "templates", "code blocks", "widgets", "form blocks" | workflows/add-endpoint.md (page component service group) |
| 8, "export", "bulk data", "export job", "download" | workflows/add-endpoint.md (export job service group) |
| 9, "automations", "marketing", "journeys" | workflows/add-endpoint.md (marketing automation service group) |
| 10, "test", "tests", "validate", "verify" | workflows/test-integration.md |
| 11, "deploy", "production", "ship", "release" | workflows/deploy-integration.md |
| 12, other | Ask clarifying questions, then select appropriate workflow or references |
After routing, read the workflow file and follow it exactly. </routing>
<reference_index> All in references/:
API Fundamentals:
Implementation:
</reference_index>
<workflows_index> All in workflows/:
| File | Purpose |
|---|---|
| build-integration.md | Create new EN API integration from scratch |
| add-endpoint.md | Add new API endpoint usage to existing integration |
| debug-api-issues.md | Troubleshoot connection, auth, rate limit issues |
| optimize-api-usage.md | Reduce API calls, implement caching, handle rate limits |
| test-integration.md | Validate API integration with tests |
| deploy-integration.md | Production deployment considerations |
</workflows_index>
<verification_loop> Always verify your EN API integration. These checks use schema and metadata endpoints only (no supporter PII):
# 1. Can we authenticate?
SESSION_TOKEN=$(curl -s -X POST \
-H "Content-Type: application/json" \
-d "{\"ens-auth-token\":\"$EN_API_USER_TOKEN\"}" \
https://ca.engagingnetworks.app/ens/service/authenticate | jq -r '."ens-auth-token"')
echo "Session token obtained: ${SESSION_TOKEN:0:10}..."
# 2. List pages (metadata only, no supporter PII)
curl -H "ens-auth-token: $SESSION_TOKEN" \
-H "Accept: application/json" \
"https://ca.engagingnetworks.app/ens/service/page?type=dc"
# 3. List supporter fields (schema only, no PII)
curl -H "ens-auth-token: $SESSION_TOKEN" \
-H "Accept: application/json" \
"https://ca.engagingnetworks.app/ens/service/supporter/fields"
# 4. Do types compile? (TypeScript)
npm run typecheck
# 5. Do tests pass?
npm testReport to user:
</verification_loop>
<success_criteria>
</success_criteria>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.