Key format
- Keys are issued by the GrowDental team and shown exactly once at creation. We store only a SHA-256 hash — a lost key cannot be recovered, only replaced.
- Store keys in a secret manager. Never commit them, log them, or ship them to browsers or mobile apps; all calls should come from your servers.
- Only
livekeys are issued today. Thegd_test_prefix is reserved for a future sandbox environment.
Scopes
Each key carries a set of scopes. Requests that need a scope your key lacks fail with403 insufficient_scope. Practice grants can further narrow scopes per practice — a request that clears your key’s scopes can still be refused for a practice whose grant does not include that scope.
Ask for the narrowest scope set that covers your integration — adding a scope later is a quick, non-breaking change on our side.
The BAA gate
Scopes marked PHI above are hard-gated in code, not just in paperwork: until a Business Associate Agreement is executed for your app, any request using them returns:Key rotation
Rotation is a coordinated, zero-downtime handoff:1
Request a new key
Email us (or use your admin contact) to issue a second key with the same
scopes. Both keys work simultaneously — there is no forced cutover.
2
Deploy the new key
Roll the new key out through your secret manager and verify traffic
succeeds with it (watch for 401s).
3
Revoke the old key
Tell us to revoke the old key. Revocation is immediate; revoked keys get
401 key_revoked on every request.lastUsedAt per key and may flag long-unused keys for cleanup.
Authentication errors
Rate limits
Limits are per key, per minute, on a fixed window:- 600 requests/minute for most endpoints.
- 60 requests/minute for bulk writes (call-request creation) — a separate budget, so bulk traffic never starves your reads.
429 rate_limited with a Retry-After header (seconds). Back off for at least that long; requests sent while limited still count against the window.