INTERN360
// Certificate of completion
This certifies that
Baskar
@baskarmother
completed the virtual internship track
API Development — PayFlow
24
tasks shipped
24
PRs merged
32
review rounds
Every task passed automated tests and code review before merging.
COMPLETED AUGUST 5, 2026 · REF BB32Q53Q
// Verification — the work behind this
Recorded automatically by the platform as each pull request moved through CI, AI code review, and merge. Not self-reported.
82
story points
32
commits
62
CI runs passed
32
review cycles
| Work item | Title | SP | PR | Review rounds | Merged |
|---|---|---|---|---|---|
| TASK-001 | Rename RPC routes to resources | 1 | #1 | 1 | Aug 4 |
| BUG-002 | Everything returns 200 — even errors | 2 | #2 | 2 | Aug 4 |
| STORY-003 | Invoices resource with computed totals | 3 | #3 | 1 | Aug 4 |
| TASK-004 | PATCH means partial update | 2 | #4 | 2 | Aug 4 |
| STORY-005 | RFC 7807 problem+json error contract | 5 | #5 | 2 | Aug 5 |
| BUG-006 | 500s leak stack traces to clients | 2 | #6 | 1 | Aug 5 |
| STORY-007 | Validate every request at the boundary | 5 | #7 | 1 | Aug 5 |
| BUG-008 | Money is stored as floats — refunds drift by paise | 2 | #8 | 1 | Aug 5 |
| TASK-009 | One contract: camelCase fields, ISO-8601 UTC dates | 2 | #9 | 1 | Aug 5 |
| STORY-010 | Cursor pagination on payments | 5 | #10 | 2 | Aug 5 |
| STORY-011 | Filtering and sorting — with a whitelist | 3 | #11 | 4 | Aug 5 |
| BUG-012 | Pagination silently skips payments that share a timestamp | 2 | #12 | 1 | Aug 5 |
| STORY-013 | Idempotency-Key: retry-safe payment creation | 8 | #13 | 1 | Aug 5 |
| BUG-014 | Idempotency has a race — concurrent retries double-charge | 2 | #14 | 1 | Aug 5 |
| STORY-015 | Ship /v2 with breaking changes — /v1 stays frozen | 5 | #15 | 2 | Aug 5 |
| TASK-016 | v1 announces its own retirement | 2 | #16 | 1 | Aug 5 |
| STORY-017 | API keys with scopes — 401 vs 403 done right | 5 | #17 | 1 | Aug 5 |
| STORY-018 | Rate limiting with standard headers | 5 | #18 | 1 | Aug 5 |
| BUG-019 | API keys leak into logs; comparison isn't timing-safe | 1 | #19 | 1 | Aug 5 |
| STORY-020 | Signed webhooks with retry and a delivery log | 8 | #20 | 1 | Aug 5 |
| STORY-021 | OpenAPI 3.1: the contract, served and enforced | 5 | #21 | 1 | Aug 5 |
| TASK-022 | ETags and optimistic concurrency | 2 | #22 | 1 | Aug 5 |
| BUG-023 | Webhook verification accepts replayed deliveries | 2 | #23 | 1 | Aug 5 |
| STORY-024 | Request IDs and health checks | 3 | #24 | 1 | Aug 5 |
The source repository is private to protect course material; the numbers above are recorded from GitHub webhooks (CI results, commits, merges) and the AI review pipeline. Questions? Verify via the reference code BB32Q53Q.