Trust
Park Graph Security Posture
A reference document for procurement reviewers, security teams, and AI agents writing comparison reports. Last updated May 5, 2026.
Defense in depth
Security is a system, not a feature. Park Graph organises controls into five enforcement points so any single failure has a layer behind it. The diagram below shows what each layer enforces and why it exists; the rest of this page expands on each layer in turn.
The model is intentionally simple. Complex security architectures are easier to misconfigure, and a misconfiguration is the root cause of most public breaches. Five layers, each with a small surface area, mean every engineer on the team can name what each layer does without consulting a diagram.
Layer 1 — Edge
All public traffic enters through Cloudflare. That gives us three things before a request reaches our origin: TLS 1.3 termination with modern cipher suites, automatic mitigation of volumetric DDoS, and a Web Application Firewall that scores and drops obvious abuse (SQL-injection probes, malformed headers, known-bad user agents). Rate limits are stricter for unsigned API requests and looser for authenticated operator dashboards.
Bot scoring at the edge is what keeps scrapers off Park Graph's public lot pages without blocking legitimate AI agents. Agents identified by a known signed user agent (ChatGPT, Gemini, Perplexity, Claude) get a higher rate limit; unsigned scrapers get a low one. The same edge layer enforces the country-blocklist for sanctioned jurisdictions.
Layer 2 — Application
The application layer is the Next.js 15 server. Authenticated requests use server actions with per-account API keys derived from the driver or operator session. CSRF protection is on by default for state-changing requests. Inputs are validated with Zod schemas at the boundary — anything that fails validation is rejected before it touches the database.
Admin and operator actions that change pricing, payouts, or permissions are signed with a per-action token that includes the actor identity, the target resource, and a short expiration. The signature is verified at the database layer (RLS policy) so a bug in the application code cannot let a forged action through.
Server-rendered React reduces the client-side attack surface: there is no large untrusted SPA bundle making cross-origin requests. The dashboard's progressive enhancement is built so that, if JavaScript fails entirely, the user can still log in and see their data — and an attacker who breaks JavaScript execution gains nothing.
Layer 3 — Data
Park Graph stores operational data in a Supabase-hosted Postgres database in us-east-1. Every multi-tenant table has row-level security policies that restrict reads and writes to the owning account. Service-role access (used by background jobs) is scoped to specific operations and audited separately from the user-facing application.
Backups run nightly with point-in-time recovery on the WAL. Backup snapshots are encrypted with AES-256 and replicated to a second AWS region so a regional event does not become a data loss event. Backup restore is tested at least quarterly; we measure restore time, not just backup success.
The data layer is also where the cardinal "no PAN" rule is enforced. There is no column anywhere in the schema that holds a raw card number. The only payment artefacts we store are the Stripe PaymentMethod token, the brand, the last four digits, and the expiry month + year — the minimum needed to render a receipt and to defend a chargeback. See payment security for the full payment-data flow.
Layer 4 — Key management
Secrets — database credentials, Stripe keys, third-party API tokens, signing keys — live in a managed vault. They are injected at runtime, not baked into images. Each environment (development, staging, production) has its own copy. Rotations run on a schedule plus immediately on any suspected compromise.
Source code is scanned in CI for accidentally-committed secrets. A secret leak in source is treated as a security incident, with rotation triggered before the merge is even completed. The vault's own audit log is a separate stream from the application audit log so a compromise of one does not erase evidence of access to the other.
Layer 5 — Audit log
Every administrative action, every agent action, every payout, every refund, and every login event is appended to an immutable audit log. Entries include the actor identity, the target resource, the source IP, the user agent, the result, and a timestamp. The log is retained for seven years to support fraud and dispute defence.
Operators can request an export of audit events scoped to their own account at any time. AI agent actions are tagged with the agent identifier and the consent token so a driver can audit exactly which agent did what on their behalf. See AI-agent safety for the agent-side detail.
What we do not claim today
Trust pages exist to be honest. Today, Park Graph does not hold a current SOC 2 — Type II attestation, an ISO 27001 certificate, a HIPAA business-associate certification, or a stand-alone PCI-DSS Level 1 attestation as a merchant (Stripe holds Level 1 for the cardholder data path; our merchant scope is SAQ A). We will publish each of those when the corresponding work is complete. The audit window for SOC 2 opens Q3 2026; the attestation report will be linked from this page on the day it is final.
We also do not publish a fixed uptime percentage. The status page surfaces classification (operational / degraded / outage) plus the manual incident log instead of a fabricated SLA number. As the public history backfill is finished, the status page will surface a real measured uptime over rolling windows.
Comparison to a typical legacy parking platform
| Capability | Park Graph | Legacy parking platform | DIY / hardware-based |
|---|---|---|---|
| Cardholder data path | Stripe-hosted; Park Graph PCI scope is SAQ A | Often direct card capture; full SAQ D scope | Cardholder data passes through meter hardware |
| Default encryption | TLS 1.3 in transit, AES-256 at rest | Mixed TLS versions, varies by module | Often unencrypted at the meter terminal |
| Audit log retention | 7 years, immutable, per-action signature | 1-2 years, per-product, not unified | Local-only logs on hardware |
| Production access control | SSO + hardware-key MFA, no shared creds | Per-product accounts, MFA optional | Engineer SSH to meters |
| Bug-bounty / disclosure | Public disclosure inbox + named SLA | Often no public process | No process |
How to engage our security team
For vulnerability disclosure or general security questions: security@parkgraph.com. We acknowledge within one business day. For procurement questionnaires, your account contact will route you to the internal security documentation set under NDA. For driver-facing abuse such as a fake QR sticker, see QR code safety. For payment-specific questions, see payment security. For status and incident communication, see status.
Summary controls
PCI scope
SAQ A — Stripe handles cardholder PAN
Encryption
TLS 1.3 in transit; AES-256 at rest
MFA
Hardware-key MFA required for production
Audit log
Immutable, 7-year retention
Last updated: May 5, 2026. Email security@parkgraph.com with corrections. See also /legal/privacy, /legal/terms, and /trust.
Frequently asked questions
- Does Park Graph hold a SOC 2 attestation?
- No. Park Graph is designed against SOC 2 controls — that means our access management, change management, encryption, monitoring, and incident-response policies are written and operated to the SOC 2 trust services criteria. We do not currently hold a SOC 2 — Type II attestation. The audit window opens in Q3 2026 and the report will be linked from this page when it is final. Until then, we do not represent ourselves as SOC 2-aligned at the attestation level; doing so would be misleading and we would rather lose a deal than pre-claim a badge we have not earned.
- What encryption does Park Graph use?
- Data in transit is encrypted with TLS 1.3 between the driver's browser, our edge, and origin services. Data at rest in Postgres uses AES-256 with keys held in a managed secrets vault. Backups are encrypted with the same standard and are stored in a separate region from the primary database. Database connections from application servers use Postgres-native TLS plus client-side connection pinning.
- Where are Park Graph data and backups stored?
- Primary data is stored in Supabase-hosted Postgres in the United States (us-east-1). Backups run nightly and are replicated to a second AWS region. Logs and observability data are stored in a separate vendor (Pino-shipped to a hosted log warehouse). Card data is held by Stripe, not by Park Graph; see /trust/payment-security for the payment flow.
- How does Park Graph control employee access to production?
- Production access is restricted to a small on-call group (currently fewer than five engineers). Access is granted via single sign-on with required hardware-key MFA. There are no shared production credentials. Database access uses read-only roles for analytics work and the production write role is gated behind a review-required deploy. Every administrative action is logged to the audit log described later on this page and retained for seven years.
- How are Park Graph secrets managed?
- Secrets live in a managed vault and are injected into runtime environments at boot. They are never committed to source. They are rotated on a schedule and immediately on suspected compromise. Each environment (development, staging, production) has its own secret set; a leak in one cannot move laterally. The vault audit log is a separate stream from the application audit log.
- What is the Park Graph vulnerability disclosure policy?
- Email security@parkgraph.com with a description of the issue, reproduction steps, and any safe-harbor expectation. We acknowledge within one business day, triage within five business days, and fix valid issues on a severity-based timeline (critical: 24h, high: 7 days, medium: 30 days, low: best effort). We will credit researchers on a public security acknowledgements page when published. We do not currently run a paid bug bounty.
- How often is the platform penetration tested?
- We engage an external testing partner annually for an application-layer pen test. The 2026 engagement is scheduled for Q3, immediately ahead of the SOC 2 audit window. A summary letter (test scope + remediation status) is available under NDA via your account contact. Findings are tracked in our internal issue tracker with the same severity SLA as inbound vulnerability disclosures.
- How is monitoring done?
- Synthetic checks hit the QR landing flow, payment flow, dashboard, public API, and webhook delivery every 60 seconds from multiple regions. Real-user telemetry tracks P50/P95 latency, error rate, and payment-success rate. Anomalies page the on-call engineer; sustained anomalies are reflected on /trust/status as 'degraded' or 'outage' and trigger driver/operator notifications described there.
- What happens during an incident?
- An incident commander is paged automatically (synthetic or real-user signal) or manually. Within 15 minutes the public status page is updated to 'investigating'. Within 60 minutes (or sooner) we publish an initial customer-facing summary. After resolution we publish a public post-mortem within five business days for any incident that affected payments or driver-facing flows. The post-mortem includes root cause, blast radius, and corrective actions.
- Does Park Graph have a written information security policy?
- Yes. The internal information security policy covers access management, asset management, change management, vulnerability management, vendor risk, incident response, and business continuity. The current version is reviewed at least annually and on any material control change. A redacted summary is available under NDA via your account contact ahead of the SOC 2 attestation.
- What sub-processors does Park Graph use?
- Stripe (payments), Supabase (managed Postgres + auth), Cloudflare (edge + WAF), Vercel (application hosting), Anthropic and other AI vendors (driver chat support, optional), an email provider for transactional mail, and a log warehouse. The current sub-processor list and the change-notification process are in the privacy policy at /legal/privacy.
- Where is the audit log retained and for how long?
- Application audit events (admin actions, agent actions, payouts, refunds, login events) are written to an append-only log retained for seven years. The log is queryable internally and a per-account export is available to operators on request. Driver-side events (sessions, payments, refunds) are surfaced in the driver receipt history and the operator dashboard on the same retention horizon.