{"$schema":"https://abundera.ai/schemas/capabilities-v1.json","schema_version":"1.0","product":{"id":"qrpro","name":"Abundera QR Pro","status":"ga","dashboard_url":"https://pro.qr.abundera.ai/dashboard/","docs_url":"https://pro.qr.abundera.ai/docs/","support_url":"https://pro.qr.abundera.ai/support/"},"api":{"base_url":"https://pro.qr.abundera.ai/api","openapi_url":"https://pro.qr.abundera.ai/docs/openapi.json","auth_methods":["session_cookie","api_key_bearer"]},"auth":{"api_key_prefix":"abnd_qrpro_","scopes":[{"id":"codes:read","label":"Read codes","description":"List + read dynamic QR codes you own.","default":true},{"id":"codes:write","label":"Write codes","description":"Create, edit, and pause your dynamic QR codes.","default":false},{"id":"codes:delete","label":"Delete codes","description":"Delete dynamic QR codes. Split from codes:write so integrations can write without destructive rights.","default":false},{"id":"stats:read","label":"Read analytics","description":"Read scan aggregates + per-code stats.","default":true},{"id":"groups:read","label":"Read groups","description":"List + read code groups (folder-style organization).","default":false},{"id":"groups:write","label":"Write groups","description":"Create + manage code groups.","default":false},{"id":"webhooks:write","label":"Write webhooks","description":"Create + manage outbound webhook endpoints.","default":false},{"id":"teams:read","label":"Read team","description":"Read team membership + invites.","default":false},{"id":"teams:write","label":"Write team","description":"Admin+ only: invite, revoke, role changes.","default":false},{"id":"invites:write","label":"Send invites","description":"Send team invites only (no other team-admin powers). For invite-bot integrations.","default":false},{"id":"audit:read","label":"Read audit log","description":"Read the audit trail for your personal or team scope. Compliance / monitoring integrations.","default":false}]},"webhooks":{"api_url":"https://pro.qr.abundera.ai/api/webhooks","signing_scheme":"hmac-sha256-stripe","signature_header":"X-Abundera-Signature","events":[{"id":"code.created","label":"Code created","description":"Fired when a new dynamic code is created in the scope."},{"id":"code.updated","label":"Code updated","description":"Fired when a code's destination, label, or design changes."},{"id":"code.paused","label":"Code paused","description":"Fired when a code transitions to paused, the shortcode still resolves but the redirect returns a notice page."},{"id":"code.unpaused","label":"Code unpaused","description":"Fired when a paused code is reactivated."},{"id":"code.deleted","label":"Code deleted","description":"Fired when a code enters grace after cancellation or is hard-deleted."},{"id":"anomaly.surge","label":"Scan surge detected","description":"Reserved for a future release. Will fire when a code's scan volume exceeds its 14-day z-score baseline. Not currently emitted."},{"id":"anomaly.drop","label":"Scan drop detected","description":"Reserved for a future release. Will fire on a sustained drop vs baseline, useful for catching broken redirects. Not currently emitted."},{"id":"team.member_added","label":"Team member added","description":"Fired when a user accepts an invite and becomes a team member."},{"id":"team.member_removed","label":"Team member removed","description":"Fired when a member is removed from the team (by admin action or self-leave)."},{"id":"team.role_changed","label":"Team role changed","description":"Fired when a member's role is promoted or demoted within the team."},{"id":"invite.accepted","label":"Invite accepted","description":"Fired when a pending team invite is accepted. Fires alongside team.member_added for the same event."},{"id":"billing.payment_failed","label":"Payment failed","description":"Fired when a subscription invoice fails, integrations can alert ops before plan transitions to past_due."},{"id":"billing.renewed","label":"Billing renewed","description":"Fired on successful subscription renewal. Useful for finance integrations logging new periods."},{"id":"plan.changed","label":"Plan changed","description":"Fired when the account's billing plan transitions (upgrade, downgrade, cancel, reactivate)."}]},"notifications":{"prefs_api_url":"https://abundera.ai/auth/service/notification-prefs","topic_prefix":"qrpro.","topics":[{"id":"weekly_digest","label":"Weekly digest","description":"Scan totals, top codes, and week-over-week deltas emailed every Monday.","default":false},{"id":"monthly_summary","label":"Monthly summary","description":"Longer rollup of the past month's activity, top codes, and notable anomalies. Sent on the 1st.","default":false},{"id":"anomaly_alerts","label":"Scan anomaly alerts","description":"Alert when a code's scan volume crosses its 14-day z-score baseline in either direction.","default":false},{"id":"team_invite","label":"Team invites","description":"Notify when someone invites you to a team, or when you're granted a new role.","default":true},{"id":"code_expiring","label":"Code expiring","description":"Warn when a code is approaching the end of its grace window after cancellation and will stop resolving soon.","default":true},{"id":"quota_warning","label":"Quota warnings","description":"Heads-up when you approach 80% of your plan's rate limit or active-codes cap.","default":false}]},"rate_limits":{"unit":"requests","tiers":[{"id":"unauth","window":"1m","limit":600},{"id":"cookie","window":"1m","limit":60},{"id":"api_key_business","window":"1d","limit":1000},{"id":"api_key_team","window":"1d","limit":10000},{"id":"api_key_agency","window":"1d","limit":50000}]}}