Trading Card API Changelog
Stay up-to-date with the latest changes, improvements, and new features in the Trading Card API itself.
API vs Documentation Changes
This page shows changes to the Trading Card API service. For changes to this documentation site, see the Documentation Changelog.
Latest Releases
All notable changes to the Trading Card API are documented here. The API follows Semantic Versioning and maintains a Keep a Changelog format.
🚀 Recent Updates
📦 [0.7.46] - January 2, 2026
Latest Release
This is the current production version of the Trading Card API.
Fixed
- fix: Correctly parse filter[status] query parameter
🔗 Release Information
📦 [0.7.45] - January 2, 2026
Added
- feat: Add filter[status] query parameter to sets endpoint (#1220)
🔗 Release Information
📦 [0.7.44] - December 30, 2025
Changed
- Updated laravel/framework from 12.40.2 to 12.44.0
- Updated laravel/passport from 13.4.1 to 13.4.2
- Updated @usebruno/cli from 2.14.3 to 2.15.1
- Updated markdownlint-cli from 0.46.0 to 0.47.0
- Updated actions/upload-artifact from v5 to v6 in GitHub workflows
- Updated actions/download-artifact from v6 to v7 in GitHub workflows
- Updated actions/cache from v4 to v5 in GitHub workflows
Security
- Resolved high-severity vulnerability in jws (HMAC signature verification)
- Resolved high-severity vulnerability in lodash.set (Prototype Pollution)
- Resolved high-severity vulnerability in lodash.template (Command Injection)
🔗 Release Information
📦 [0.7.43] - December 30, 2025
Fixed
- PlayerTeam url() method now correctly includes v1 route prefix (#1216)
🔗 Release Information
📦 [0.7.42] - December 29, 2025
Added
- Set names now include serial number suffix for numbered parallels (#1213)
- Uses standard hobby convention:
/Xfor numbered sets (e.g., "Black Foil /10") - Shows
1/1for superfractors (serial = 1) - Skips append if name already ends with a serial suffix to prevent duplicates
- Run
php artisan api:update-names --setsafter deployment to update existing sets
🔗 Release Information
📦 [0.7.41] - December 26, 2025
Fixed
- Card deletion now removes ALL oncard relationships instead of only the first one (#1202)
- Previously, deleting a card with multiple oncard entries (players, teams, playerteams) only removed the first entry
- This caused orphaned OnCard records to remain in the database
- Fixed by using bulk delete instead of
firstOrFail()->delete() - Same fix applied to card attributes deletion
Added
- MCP tool
get_card_oncardto list all oncard relationships in a simple, structured format (#1202) - Returns players, teams, and playerteams grouped by type with names
- Designed for data correction workflows where you need to see what's attached to a card
- MCP tool
clear_card_oncardto remove all oncard relationships from a card (#1202) - Clears all players, teams, and playerteams at once to start fresh
- Follows two-step confirmation pattern for safety
🔗 Release Information
📦 [0.7.40] - December 26, 2025
Fixed
- Parallel set sync now preserves on-card relationship order, ensuring multi-player card names match between parent and parallel sets (#1208)
- Added
sort_ordercolumn toapi_on_cardtable with migration to backfill existing records - Updated
OnCard::sync()to preserve array order as sort_order - Updated
Card::onCard()relationship to order by sort_order - Updated
CreateCardForParallelSetandUpdateCardForParallelSetjobs to preserve sort_order - Added
sort_orderto API response viaOnCardTransformer
🔗 Release Information
📦 [0.7.39] - December 26, 2025
Added
- API endpoint test coverage for parallel set
card_countinheritance (#1205) - Verifies
card_countis inherited from parent when creating parallel sets via API - Confirms explicit
card_countvalues are preserved when provided - Tests taxonomy inheritance (genre, manufacturer, year, brand)
- Covers insert set behavior (should NOT inherit
card_count) - Edge case tests for boundary conditions:
- Inheritance of zero
card_countfrom parent - Explicit zero
card_countpreservation - Parallel set without
parent_id(no inheritance) - Taxonomy inheritance with explicit
card_count - Very large
card_countvalues (9999+) - Sets with both
is_parallelandis_insertflags - Inheritance of null
card_countfrom parent
🔗 Release Information
📦 [0.7.38] - December 26, 2025
Fixed
- CardController::update() now returns 404 instead of 500 when card doesn't exist (#1180)
🔗 Release Information
📦 [0.7.37] - December 26, 2025
Fixed
- Fix validation rule typo in AttributeRequest causing 500 error (#1203)
🔗 Release Information
📦 [0.7.36] - December 25, 2025
Added
- New
POST /v1/sets/{id}/sync-parallelendpoint for syncing parallel sets (#1171) - Adds missing cards from parent set to parallel set
- Copies on-card relationships (players, teams, playerteams) from parent cards
- Copies card attributes with pivot values from parent cards
- Returns count of created/skipped/updated cards
- Supports async processing via
?queue=trueparameter - Addresses limitation where
ParallelizeSetonly runs on initial parallel set creation
🔗 Release Information
📦 [0.7.35] - December 25, 2025
Added
- Explicit tests for
current_card_countfield accuracy after card changes (#1157) - Verifies cache invalidation correctly updates
current_card_countin checklist responses - Tests card creation, deletion, and restoration scenarios for both V1 and V2 endpoints
- Provides regression protection for the cache invalidation added in #1156
Changed
- Optimized cache invalidation performance (#1157)
- Pre-computed include combinations as constant to eliminate runtime bit manipulation
- Removed duplicate cache clearing logic from tests (now delegates to SetCacheHelper)
- Reduced CPU overhead during cache invalidation operations
🔗 Release Information
📦 [0.7.34] - December 24, 2025
Fixed
- Checklist import now correctly parses serial numbers from end of line (#1154)
- Input like
Player - Team /10now extracts serial as10instead of including/10in team name - Supports both
/10and#/10formats at end of line - Maintains backward compatibility with existing
#/ 10space-separated format
🔗 Release Information
📦 [0.7.33] - December 23, 2025
Fixed
parent_idfilter now works correctly in GET /v1/sets endpoint (#1146)- Previously the parameter was ignored and returned unrelated parent sets
- Now correctly returns child sets (parallels/inserts) of the specified parent
- Returns empty array when parent has no child sets
🔗 Release Information
📦 [0.7.32] - December 23, 2025
Added
- Year filtering capability to
/v1/setsendpoint viayearquery parameter (#1191) - Filter sets by year ID (UUID) for targeting specific release years
- Enables
/prepare-publicationworkflow to focus on recent releases
🔗 Release Information
📦 [0.7.31] - December 23, 2025
Added
subset_countfield to Set API responses (#1192)- Returns the count of child subsets for each set
- Enables UI to show expand indicators for sets with subsets
- Uses eager loading via
withCountto prevent N+1 queries
Fixed
- Optimized
current_card_countfield in SetTransformer to use eager loading (#1192) - Also uses
withCount('cards')to prevent N+1 queries - Both
subset_countandcurrent_card_countnow use efficient eager loading
🔗 Release Information
📦 [0.7.30] - December 22, 2025
Fixed
- SetSource API endpoint now properly accepts set_id during creation (#1188)
🔗 Release Information
📦 [0.7.29] - December 22, 2025
Added
- Queue parameter for POST /v1/sets/{id}/checklist endpoint (#1186)
queue=truedispatches import to background job for async processing- Prevents timeout for large checklists (50+ cards)
- Default behavior unchanged (synchronous processing)
🔗 Release Information
📦 [0.7.28] - December 21, 2025
Added
- Override mechanism for parallel cards (#1163)
- Fields can be explicitly marked as overridden to prevent sync from parent card
- New
field_overridesJSON column on cards tracks which fields should not be inherited - Valid overridable fields: title, number, description, is_rookie, serial, section
- API support for viewing and managing field overrides on parallel cards
- Auto-override: When a parallel card's propagatable field is directly updated, it's automatically marked as overridden
- Two-layer approach: Explicit overrides take precedence over implicit detection
🔗 Release Information
📦 [0.7.27] - December 21, 2025
Added
- Cascade delete/restore for parallel cards (#1162)
- When a base card is deleted, all parallel card children are automatically soft-deleted
- When a base card is restored, all trashed parallel card children are automatically restored
- Cache invalidation for affected parallel sets
🔗 Release Information
📦 [0.7.26] - December 21, 2025
Fixed
- CreateCardForParallelSet job now copies card attributes when creating parallel cards (#1178)
🔗 Release Information
📦 [0.7.25] - December 20, 2025
Added
- Update propagation for parallel cards (#1161)
- When a base card is updated, changes automatically propagate to all parallel card children
- Override detection: Fields that differ from the parent's original value are preserved
- Propagates: title, number, description, is_rookie, serial, section
- Also syncs onCard relationships and attributes
- Uses queued jobs for performance (non-blocking API response)
🔗 Release Information
📦 [0.7.24] - December 20, 2025
Fixed
- SetController::update now properly triggers Eloquent observers (#1175)
- Fixes
is_paralleltoggle not dispatching ParallelizeSet job via API - Enables MCP
parallelize_settool to work correctly
🔗 Release Information
📦 [0.7.23] - December 20, 2025
Added
- Queue workers now restart automatically after code updates in local development (#1173)
- Prevents stale code issues when queue job logic changes
🔗 Release Information
📦 [0.7.22] - December 20, 2025
Fixed
- Team name parsing now correctly handles multi-word locations (St. Louis, New York, Los Angeles, etc.) (#1168)
- Previously "St. Louis Cardinals" was incorrectly split as location="St.", mascot="Louis Cardinals"
- Now correctly parses as location="St. Louis", mascot="Cardinals"
- Supports 45+ known multi-word city/region names including Salt Lake City, Tampa Bay, Kansas City
Added
- New
cleanup:fix-team-location-splitscommand to correct existing incorrectly-split team names --analyze: Identify teams with potential incorrect splits--dry-run: Preview proposed changes without applying--genre=: Filter by specific sport/genre
🔗 Release Information
📦 [0.7.21] - December 19, 2025
Added
- Parallel set card creation now copies onCard relationships (players, teams, playerteams) from parent cards (#1169)
- Cards in parallel sets now display full names with player info instead of just numbers
- Card name auto-generation works correctly for parallel cards
🔗 Release Information
📦 [0.7.20] - December 19, 2025
Added
- Comma-delimited player/team format support in checklist import (#1166)
- Converts
Player Name, Team NametoPlayer Name - Team Nameformat automatically - Handles edge cases like name suffixes (Jr., Sr., II, III, etc.) correctly
- Both comma and dash formats now work for checklist import
🔗 Release Information
📦 [0.7.19] - December 19, 2025
Added
- Ability to mark existing sets as parallel and have cards copied from parent (#1135)
- SetObserver now dispatches ParallelizeSet job when is_parallel changes to true
- Prevents duplicate card copying by checking if parallel set already has cards
- Comprehensive test coverage for parallel card inheritance feature (#1135)
- SetObserverTest: Tests for taxonomy inheritance, card_count inheritance, job dispatching
- CardObserverParallelTest: Tests for parallel subset card creation
- ParallelSetIntegrationTest: End-to-end workflow tests
Fixed
- CardObserver now correctly iterates all subsets when creating parallel cards (#1135)
- Changed
breaktocontinueto process all parallel subsets instead of stopping at first non-parallel
Changed
- Improved robustness of parallel card job handlers (#1135)
- ParallelizeSet job now validates set and parent exist before processing
- CreateCardForParallelSet job validates set and card exist before replication
- Added idempotency check to prevent duplicate card creation on job retries
- Performance optimizations to reduce memory usage in observer queries
- Added comprehensive test coverage for edge cases and race conditions
🔗 Release Information
📦 [0.7.18] - December 17, 2025
Added
is_variationboolean column to sets table for variation sets (#1145)- Supports sets that share card numbering with parent but have different visual treatment (e.g., "Tin Type Variations", "Chrome Variations")
- Added to Set model, SetTransformer, and OpenAPI schema
🔗 Release Information
📦 [0.7.17] - December 17, 2025
Added
- Add Laravel scheduler supervisor configuration for Docker containers (#1158)
- Enables scheduled commands like
stats:capture-snapshotsto run automatically
🔗 Release Information
📦 [0.7.16] - December 16, 2025
Fixed
- Card deletion now invalidates set checklist cache to prevent stale data (#1155)
- Added cache invalidation for V1 and V2 checklist endpoints
- Cache is cleared on card create, update (number/name), delete, and restore
- Supports both 'full' and 'compact' format cache keys
🔗 Release Information
📦 [0.7.15] - December 15, 2025
Fixed
- Fix "Class Oncard not found" error when assigning multiple players to a card (#1152)
🔗 Release Information
📦 [0.7.14] - December 12, 2025
Fixed
- Missing
cache_lockstable preventing scheduled jobs from running (#1142)
🔗 Release Information
📦 [0.7.13] - December 2, 2025
Added
- docs: Add OpenAPI documentation to stats snapshot endpoints
Fixed
- fix: Update stats endpoints to return SDK-compatible response format
🔗 Release Information
📦 [0.7.12] - November 30, 2025
Added
- feat: Add daily snapshot scheduled job (#1127)
stats:capture-snapshotsArtisan command for capturing entity count snapshots- Scheduled to run daily at 04:00
--dateoption for backfilling historical data
🔗 Release Information
📦 [0.7.11] - November 29, 2025
Added
- feat: Add stats API endpoints (#1126)
- GET
/v1/stats/counts- Current entity counts for sets, cards, players, and teams - GET
/v1/stats/snapshots- Historical snapshots with filtering by entity type and date range - GET
/v1/stats/growth- Growth metrics by period (7d, 30d, 90d, 1y)
🔗 Release Information
📦 [0.7.10] - November 29, 2025
Added
- feat: Add entity snapshots table and model (#1125)
🔗 Release Information
📦 [0.7.9] - November 29, 2025
Fixed
- OAuth refresh token ID column too small causing login failures (#1123)
🔗 Release Information
📦 [0.7.8] - November 27, 2025
Fixed
- Fix 500 error when including oncard with orphaned records
🔗 Release Information
📦 [0.7.7] - November 27, 2025
Added
- Implement PlayerTeamController.show() method (#1110)
- GET
/v1/playerteams/{id}endpoint now functional with?include=player,teamsupport - Enables MCP tool
get_playerteamto fetch individual playerteam records
Changed
- Update Docker base image to PHP 8.5-fpm (#1102)
- Remove opcache from Dockerfile ext-install (built-in to PHP 8.5)
- Disable xdebug in Dockerfile (not yet compatible with PHP 8.5)
- Update all PHP dependencies (#1111):
- laravel/framework 12.38.1 → 12.40.2
- laravel/helpers 1.8.1 → 1.8.2
- laravel/passport 13.4.0 → 13.4.1
- laravel/tinker 2.10.1 → 2.10.2
- nunomaduro/collision 8.8.2 → 8.8.3
- phpunit/phpunit 12.4.2 → 12.4.4
- slevomat/coding-standard 8.24.0 → 8.25.1
- Update GitHub Actions: actions/checkout v5 → v6, PHP 8.3 → 8.5 in all workflows
- Update JavaScript dependencies in docs/scripts
Fixed
- CardController.update() now respects the
includequery parameter (#1109) - PATCH responses now include relationship data when requested (e.g.,
?include=oncard) - Enables MCP tools to verify relationship changes after card updates
- Fix JsonApiHeader middleware for Symfony 8.x AcceptHeader behavior change
🔗 Release Information
📦 [0.7.6] - November 24, 2025
Added
- Bulk image upload endpoint (
POST /v1/card-images/bulk) supporting up to 50 images per request (#1050) - Batch status tracking endpoint (
GET /v1/card-images/bulk/{batch_id}) for polling upload progress - Laravel job batching for async image processing with progress tracking
- Atomic mode option for all-or-nothing batch uploads
🔗 Release Information
📦 [0.7.5] - November 21, 2025
Changed
- Define OAuth scopes in AuthServiceProvider (Issue #889)
🔗 Release Information
📦 [0.7.4] - November 16, 2025
Changed
- Updated OpenAPI specification to document missing relationships (#1089)
- Added
imagesrelationship to Card schema - Completes documentation for Card Images feature (v0.7.0)
- Defined as one-to-many array of card_images resources
- Added
sourcesrelationship to Set schema - Completes documentation for Set Sources feature (v0.6.0)
- Defined as one-to-many array of set_sources resources
🔗 Release Information
📦 [0.7.3] - November 14, 2025
Changed
- github-actions(deps): bump actions/github-script from 7 to 8
🔗 Release Information
📦 [0.7.2] - November 14, 2025
Fixed
- Fix CHANGELOG.md version numbers after re-tagging 0.7.0 and 0.7.1 releases (#1085)
🔗 Release Information
📦 [0.7.1] - November 14, 2025
Fixed
- Fix version.sh to recognize 'Release TCAPI X.Y.Z' commit message pattern in addition to 'Release version X.Y.Z' (#1083)
🔗 Release Information
📦 [0.7.0] - November 14, 2025
Added
- Card Images System - Complete card image management system (#1045, #1046, #1047, #1048)
- Full CRUD API at
/v1/card-imageswith multipart file upload support - Support for front and back card images with unique constraint per card
- File validation: JPEG, PNG, WebP (up to 10MB, max 4000x4000px)
- Automatic JPEG standardization for all uploaded images
- Soft delete support - images never permanently deleted
- Factory support for testing with
CardImageFactory - JSON:API compliant requests and responses
- OpenAPI documentation for all image endpoints
- Automatic Thumbnail Generation (#1046)
- Three thumbnail sizes: small (150w), medium (300w), large (600w)
- Asynchronous generation using queued jobs (GenerateImageThumbnails)
- Quality optimization per size: 100% (original), 85%/80%/75% (large/medium/small)
- Download endpoint supports
?sizeparameter - Graceful failure handling with 3 retry attempts
php artisan images:regenerate-thumbnailscommand for bulk operations- Config-driven thumbnail system via
config/images.php - JPEG Standardization (#1047)
- All uploaded images converted to JPEG for consistency
- Smart JPEG handling: existing JPEGs stored as-is (no re-encoding)
- PNG/WebP conversion at 100% quality
- Rich variant metadata: width, height, file_size, quality, format
- Srcset generation for responsive images
- Sizes attribute recommendations for optimal browser selection
- CDN Integration (#1048)
- DigitalOcean Spaces CDN integration for global delivery
- Versioned URLs with automatic cache invalidation (
?v=timestamp) - Smart redirect: Download endpoint (302) to CDN instead of proxying
- Cache headers: 1-year TTL with immutable directive
- Model methods:
cdnEnabled(),getCdnUrl(),getVersionedUrl() - Comprehensive CDN setup documentation
- Fallback support for local disk when CDN not configured
- Comprehensive Testing (#1063, #1073, #1078)
- 628 total tests (77 new for Card Images functionality)
- CardImageRestTest: 29 API endpoint tests
- CardImageModelTest: 14 model and relationship tests
- CardImageCdnTest: 13 CDN functionality tests
- CardImageSchemaValidationTest: 24 JSON:API schema validation tests
- ImageUploadServiceTest: 21 service layer tests
- CardImageController tests: 18 authorization and CRUD tests
- GenerateImageThumbnails tests: 8 job tests
- 52 Bruno CLI integration tests for Card Images
- Performance benchmarking deferred to #1079
Changed
- Image upload service now sets cache headers on upload to Spaces
- CardImageTransformer returns versioned CDN URLs in all responses
- Download endpoint redirects to CDN when enabled
- All image URLs include version parameter for cache busting
- Card relationship:
?include=imagessupport in Card API responses
Configuration
- New
config/images.phpfor centralized image configuration .env.exampleincludes comprehensive image/CDN variablesIMAGE_STORAGE_DISKenv variable (local, s3, or spaces)- DigitalOcean Spaces configuration (DO_SPACES_*)
- CDN endpoint configuration (DO_SPACES_CDN_ENDPOINT)
🔗 Release Information
📦 [0.6.1] - November 8, 2025
Fixed
- Fix version script to extract version from commit message for squash-merged releases (#1054)
- Version script now correctly handles squash merges from release branches
- Extracts version from "Release version X.Y.Z" commit message pattern
- Prevents creating incorrect versions (e.g., 0.5.1 instead of 0.6.0)
🔗 Release Information
📦 [0.6.0] - November 8, 2025
Added
- Image UUID field for cards (#1014)
- New
image_uuidfield inapi_cardstable for storing image references - Support for UUID-based image naming convention
- Indexed for efficient lookups
- Nullable field for backward compatibility
- Included in Card API responses
- Factory support with
withImage()method for testing - Set source tracking table and API (#1013)
- New
api_set_sourcestable to track data sources for sets - Support for tracking checklist, metadata, and images sources
- Source URL, name, type, and verification timestamp
- Unique constraint: one source per type per set
- Cascade delete when parent set is removed
- Optional
sourcesinclude in Set transformer - Full CRUD API endpoints at
/v1/set-sources - JSON:API compliant requests and responses
- Request validation for all operations
- v2 API endpoints with corrected checklist response structure (#972)
- New
/v2/cardsand/v2/setsendpoints - Fixed JSON:API compliance issues from v1 endpoints
- Improved response structure consistency
- Personal Access Token authentication (#891, #1007, #1009)
- Simplified authentication for GPT and API clients
- Documentation for Personal Access Token usage
- OpenAPI documentation updates
- Per-client rate limiting for OAuth clients (#1002, #1004)
- Configurable rate limits per OAuth client
- Operator documentation for rate limit configuration
- Enhanced API security and resource management
- OAuth scope-based authorization (#948, #955, #956, #960, #965)
- Read scope for data retrieval operations
- Write scope for create/update operations
- Delete scope for deletion operations
- Status filtering based on OAuth scopes
- OAuth2 Password Grant support (#939)
- Enable OAuth2 password grant in Passport 13
- Admin authentication workflows
- MCP server integration (#949, #1007)
- Data cleanup workflows via MCP
- Testing documentation for MCP servers
- Release discovery slash commands (#986, #987, #991, #992, #993, #994, #995, #996)
/discover-new-releases- AI-powered release discovery foundation/add-release- Helper command for single set addition- Multi-source web scraping for release discovery
- Database cross-checking logic
- Interactive review and confirmation flow
- Batch set creation with error handling
- Comprehensive workflow documentation
- Auto-linking of branches to issues in
/issuecommand - Data cleanup slash commands (#916, #930, #932, #975, #976)
- Interactive set cleanup slash command system
/find-missing-oncard(renamed from/find-missing-players)- Data-cleanup agent for card and set publication preparation
- Documentation improvements (#912, #957, #966)
- Comprehensive database schema documentation
- Comprehensive OAuth 2.0 documentation
- Testing and quality improvements
- Linting workflow for fast code quality checks (#989, #990)
- Consolidate integration test commands into Makefile (#963)
- Review and fix skipped tests (#1027, #1029)
- Protected block system for documentation generation (#826, #1016)
- Simplify documentation generation workflow
- CLI flags for selective documentation generation
Changed
- Upgraded PHPUnit to 12.4 (#1037)
- Breaking: PHP 8.3+ now required
- Migrated PHPUnit test annotations to PHP 8 attributes (#1036)
- All 491 tests passing
- Updated all dependencies from Dependabot PRs (#1017, #1032)
- Laravel, Passport, and other core dependencies updated
- GitHub Actions dependencies updated
- All tests passing after updates
- Consolidated dependency updates (#1052, #1053)
- Updated lcobucci/clock from 3.3.1 to 3.5.0
- Updated @usebruno/cli from 2.13.2 to 2.14.0
- Standardized GitHub Actions to latest versions
- All tests passing after updates
- Improved release notes generation (#1023)
- Include CHANGELOG.md content in release notes
- Add issue links to release notes
- Data quality improvements
- Standardized player names for consistency (#1010)
- Standardized team names for consistency (#922, #1015)
- Completed manufacturer data for 14,101 sets (#919, #925)
- Fixed orphaned cards (#918, #924)
- Cleanup command for soft-deleted records (#920, #928)
- UUID primary key optimization (#910)
- Complete optimization with OPTIMIZE and ANALYZE
Fixed
- Fix release action to tag correct commit instead of defaulting to master (#1052, #1053)
- Added
commitparameter to ncipollo/release-action in all release workflows - Ensures RC and beta tags point to correct branch commits
- Fixes "already_exists" error when creating releases
- Fix
/v1/setsendpoint pagination to acceptper_pageparameter (#1024) - Fix Bruno collection issues found during manual API testing (#1019, #1030)
- Fix API welcome page version display (#943, #1005)
- Fix markdown linting violations in
docs/folder (#962, #964) - Resolve PHP 8.x deprecation warnings in card name generation (#945, #974)
Removed
- Deprecated non-versioned API routes (#1025)
- Removed all non-versioned endpoints
- All API access now requires
/v1/or/v2/prefix - Deprecated
api_card_player_teamstable (#923, #929) - Data cleanup phase 3 completion
- Legacy table structure removed
- Duplicated slash commands migrated to tools repository (#1022)
- Cleanup of redundant commands
🔗 Release Information
📦 [0.5.0] - November 1, 2025
🎉 Highlights
- Modern Testing Framework: Upgraded to PHPUnit 12.4.2 with PHP 8.3+ support
- Comprehensive Dependency Updates: 47 packages updated including Laravel 12.36.1 and Passport 13.3.0
- JSON:API Compliance: Strict header validation enforcement for all v1 endpoints
- Cleaner API Surface: Removed deprecated non-versioned routes
- Enhanced Testing: 491 PHPUnit tests + 111 Bruno integration tests, all passing
- Improved Code Quality: PHP_CodeSniffer 4.0, full markdown linting compliance
Added
- JSON:API Accept and Content-Type header validation (#1026)
- Strict JSON:API specification compliance for all v1 endpoints
- Content-Type header required on POST/PUT/PATCH/DELETE requests
- Returns 415 Unsupported Media Type for invalid Content-Type
- Returns 406 Not Acceptable for invalid Accept parameters
- CLI flags for selective documentation generation (#826)
- Team name standardization command (#922)
- Player name standardization command (#921)
- Abstract CleanupCommand base class for data quality tools
Changed
- Upgraded PHPUnit from 11.5.43 to 12.4.2 (#1034, #1035)
- Breaking: PHP 8.3+ now required (upgraded from 8.2)
- Migrated all test annotations to PHP 8 attributes
- Updated 4 test files with 47 test methods
- Eliminates all 50 PHPUnit deprecation warnings
- All 491 tests pass, 111 Bruno integration tests pass
- Updated all dependencies (#1017, #1032)
- GitHub Actions (5 updates): upload-artifact v5, download-artifact v6, setup-node v6, git-auto-commit v7, github-script v8
- PHP/Composer (38 updates): Laravel 12.36.1, Passport 13.3.0, webpatser/laravel-uuid 6.2.0 (major), PHP_CodeSniffer 4.0 (major)
- Node.js/npm (3 updates): @usebruno/cli 2.13.2, dotenv 17.2.3, axios 1.13.1
- All 491 PHPUnit tests pass after updates
- Replace Route::resource() with Route::apiResource() for all v1 endpoints (#1019)
- Removes unnecessary
createandeditroutes (for HTML forms, not APIs) - Reduces routes from 7 to 5 per resource
- Improve release notes generation to use CHANGELOG.md content (#830)
- Simplified documentation generation to API reference only (#826)
- Removed hardcoded version numbers from auto-generated docs
- README.md and guide docs are now regular markdown files
- Reduces documentation churn on version bumps
Removed
- Deprecated non-versioned API routes (#1021)
- Breaking: All endpoints now require version prefix (e.g.,
/v1/cards) - Removed 12 legacy controllers
- Removed DeprecatedRoute middleware
- Removed 13 deprecated test files
- Unused newman package and 64 transitive dependencies (#1017)
- Project now uses Bruno CLI exclusively for API testing
- Reduces npm package count by 65 packages
- Reduces npm security vulnerabilities from 7 to 4
- Migrated data quality slash commands to tradingcardapi-tools repository (#1020)
Fixed
/v1/setsendpoint pagination (#997)- Accept both
per_page(JSON:API standard) andlimit(legacy) - Add validation to enforce maximum of 100 items per page
- Resolves MCP server token limit issues
- Fix 56 duplicate Bruno request files (#1019)
- Fix broken validation script in 32 Bruno request files (#1019)
- Fix Attribute and ObjectAttribute url() methods missing API version prefix (#1019)
- Review and fix all skipped tests - reduced from 4 to 0 (#1027)
- Fix all markdown linting issues (#826)
Security
- OAuth2 security improvements via Laravel Passport 13.3.0
- JWT security improvements via lcobucci/jwt 5.6.0
- Symfony component security patches (11 packages)
Testing
- 491 PHPUnit tests - all passing with PHPUnit 12.4.2
- 111 Bruno integration tests - all passing
- Zero skipped tests - all problematic tests fixed
- PHP_CodeSniffer 4.0 - all 320 files pass
- Full markdown linting - all docs compliant
🔗 Release Information
📦 [0.4.23] - October 18, 2025
Added
- Interactive set cleanup slash command system for data quality management (#930, #932)
- Cleanup command for soft-deleted records with configurable retention periods (#920, #928)
- Data-cleanup agent for card and set publication preparation with automated quality checks (#916)
- Comprehensive database schema documentation with entity relationships and data quality metrics (#912)
Changed
- Enabled OAuth2 password grant in Passport 13 for admin authentication support (#939)
- Complete UUID primary key optimization with OPTIMIZE and ANALYZE for improved query performance (#910)
- Complete manufacturer data for 14,101 sets using automated matching and assignment (#919, #925)
Removed
- Deprecated api_card_player_teams table as part of Data Cleanup Phase 3 (#923, #929)
Fixed
- Fix orphaned cards without valid set relationships (#918, #924)
🔗 Release Information
📦 [0.4.22] - October 12, 2025
Fixed
- Fix checklist card ordering to use natural sort (Issue #904)
🔗 Release Information
📦 [0.4.21] - October 12, 2025
Added
- Add Bruno test files for format parameter
- Add compact format parameter to checklist endpoint (Issue #901)
🔗 Release Information
📦 [0.4.20] - October 12, 2025
Removed
- Remove release_date from OpenAPI spec (Issue #899)
Fixed
- Fix: Add validation for order_by parameter to prevent 500 errors (Issue #899)
🔗 Release Information
📦 [0.4.19] - October 12, 2025
Fixed
- Fix: Make Accept header optional for API calls (Issue #897)
🔗 Release Information
📦 [0.4.18] - October 12, 2025
Fixed
- Fix: Replace Card::all() with paginated query to prevent memory exhaustion
- Fix: Remove expensive user authentication from rate limiter
- Fix: Increase PHP memory limit to 512M to resolve Personal Access Token authentication failures
🔗 Release Information
📦 [0.4.17] - October 12, 2025
Added
- docs: Add Personal Access Token support to Bruno collection
Fixed
- fix: Make Personal Access Token test skip gracefully when not configured
- fix: Correct middleware naming to resolve test failures
- hotfix: Enable Personal Access Token authentication for API endpoints
🔗 Release Information
📦 [0.4.16] - October 11, 2025
Added
- Add 'read' OAuth scope for ChatGPT GPT integration (Issue #888)
🔗 Release Information
📦 [0.4.15] - October 11, 2025
Fixed
- Fix version script and code style issues
- Fix: Use static return type instead of self for withParameters
- Fix: Add default parameter and return type to withParameters
- Fix: Implement missing withParameters method in AuthorizationViewResponse
- Hotfix: Bind Passport AuthorizationViewResponse for OAuth authorization flow (Issue #885)
🔗 Release Information
📦 [0.4.14] - October 3, 2025
Fixed
- Fix card attribute clearing when using object-attributes relationships format
🔗 Release Information
📦 [0.4.13] - October 3, 2025
Added
- Implement container separation for API project local development
Changed
- Finalize API makefile environment variable handling
Fixed
- Fix upd command to properly handle environment variables
🔗 Release Information
📦 [0.4.12] - October 3, 2025
Fixed
- Fix test failure in CardRestTest::testExtraAttributesClear
- Fix markdown linting errors in DATASET-MANAGEMENT.md
- Fix card attribute assignment bug (Issue #874)
🔗 Release Information
📦 [0.4.11] - October 2, 2025
Changed
- github-actions(deps): bump actions/github-script from 7 to 8
Fixed
- hotfix: Fix version automation infinite loop (#872)
🔗 Release Information
📦 [0.4.10] - October 1, 2025
Changed
- Trigger CI after cleaning up test tags
🔗 Release Information
📦 [0.4.9] - October 1, 2025
Added
- Add Dataset Management documentation to README
- Add snapshots directory to dockerignore and clean up orphaned files
- Add fast backup/restore system with shell scripts
- Add comprehensive background dataset import system
- feat: implement lightning-fast database switching for dataset management
- docs: add comprehensive dataset management documentation
- feat: implement dataset management system for development/testing
Changed
- Update DATASET-MANAGEMENT.md to remove obsolete sections
- Simplify dataset management system by removing database switching
- Update dataset management documentation with backup/restore system
- Exclude Docker storage directory from builds and git
- Simplify dataset management system to single database approach
Removed
- Remove references to non-existent dataset:reset command
- Remove cross-project integration and clean up dataset configuration
- Remove obsolete ImportProductionDatasetJob
- Remove dataset API endpoint and controller
- Remove obsolete DatasetImportBackgroundCommand
- Remove obsolete DatasetForceRestartCommand
- Remove obsolete DatasetCleanupCommand and scheduled cleanup
- Remove legacy snapshots directory and references
Fixed
- fix: exclude dataset snapshots from Docker build context
🔗 Release Information
📦 [0.4.8] - September 19, 2025
Added
- Add set_id field to Card API response
🔗 Release Information
📦 [0.4.7] - September 18, 2025
Fixed
- Fix JSON escaping in trigger-docs-update.yaml workflow
🔗 Release Information
📦 [0.4.6] - September 18, 2025
Added
- Add workflow to trigger documentation updates on releases
Changed
- Trigger CI after cleaning up test tags
🔗 Release Information
📦 [0.4.5] - September 6, 2025
Added
- Add token fallback for Dependabot PRs
Changed
- npm(deps-dev): bump @usebruno/cli from 1.40.0 to 2.9.1
🔗 Release Information
📦 [0.4.4] - September 5, 2025
Added
- Add commit deduplication to changelog script
- Add token fallback for Dependabot PRs
Changed
- github-actions(deps): bump actions/download-artifact from 4 to 5
🔗 Release Information
📦 [0.4.3] - September 5, 2025
Changed
- Use actual committer's name and email for automation commits
- Use DEPLOY_APP_TOKEN to trigger status checks on automation commits
- Replace manual git commands with git-auto-commit-action
- Improve auto-version-bump exclusion logic
- Disable auto-version-bump for workflow development branches
- Restore content to empty 0.4.3 changelog section
Fixed
- Fix git-auto-commit-action configuration issues
🔗 Release Information
📦 [0.4.2] - September 5, 2025
Added
- Document new automated PR version management system
Changed
- Update CLAUDE.md with new automated PR workflow documentation
- Start fresh: remove entire 0.4.2 section for clean automation test
- Resolve changelog conflict - accept clean automated version
- Re-enable automation for all release PRs including workflow development
- Automate version bump workflow for release PRs
Removed
- Remove useless automatic version updates comment from workflow
- Remove manual changelog entry to let automation handle everything
- Remove outdated manual workflow instructions from PR comments
Fixed
- Fix PR status checks by forcing CI run on final commit
- Fix all remaining markdown linting issues in documentation
- Fix corrupted changelog structure after merge conflict
- Final fix: disable auto-version-bump for workflow development branches
🔗 Release Information
📦 [0.4.1] - September 5, 2025
Changed
- Updated GitHub Actions dependencies
- Bump actions/checkout from v4 to v5 (Dependabot)
🔗 Release Information
📦 [0.4.0] - September 5, 2025
🔒 Major Security & Rate Limiting Features
- Comprehensive Rate Limiting System with Redis backend and tiered limits (Issues #678, #680, #681)
- Anonymous rate limits: 100 requests/hour
- Authenticated rate limits: 2000 requests/hour
- OAuth client rate limits: 1000 requests/hour
- OAuth token endpoint: 10 requests/minute
- Rate limit headers in all responses
- Comprehensive test suite with performance and edge case testing
📊 API Usage Analytics & Monitoring
- Comprehensive API usage logging system for rollout analytics (Issue #735)
ApiUsageLoggingmiddleware for automatic request trackingLogApiUsagejob for asynchronous database logging- Database migration for
api_usage_logstable with optimized indexes - Complete test coverage with 20 test cases (unit and feature tests)
- Analytics queries for endpoint popularity, response times, and error rates
- Endpoint normalization for ID and UUID parameters
🔧 Infrastructure & Dependencies
- Updated all PHP and Node.js dependencies to latest secure versions (Issue #791)
- Laravel framework 12.21.0 → 12.28.1
- Laravel Passport 13.0.6 → 13.2.0
- PHPUnit 11.5.27 → 11.5.36
- Node.js 22 → 23
- Security fixes for @usebruno/cli and newman packages
- Updated GitHub Actions to latest versions
📚 Enhanced Documentation & Testing
- Comprehensive rate limiting documentation across all relevant files
- Manual rate limiting testing command (
php artisan test:rate-limiting) - Bruno CLI integration tests for rate limiting scenarios
- Troubleshooting procedures and debugging guides
- Enhanced documentation generation with preserved manual content
- Fixed documentation template formatting issues
⚠️ Breaking Changes
- New rate limiting may affect high-volume API consumers:
- Anonymous users now limited to 100 requests/hour (previously unlimited)
- OAuth token generation limited to 10 requests/minute
- New rate limit headers in all responses
🐛 Bug Fixes
- Resolved API usage logging content removal during version bumps
🔗 Release Information
📦 [0.3.9] - August 13, 2025
Fixed
- Documentation workflow not triggering when workflow file itself is updated
🔗 Release Information
📦 [0.3.8] - August 12, 2025
Fixed
- Documentation generation workflow references to non-existent docs/generated/ directory
🔗 Release Information
📦 [0.3.7] - August 12, 2025
Fixed
- Documentation generation workflow failing due to incorrect npm script name
🔗 Release Information
📦 [0.3.6] - August 12, 2025
Fixed
- OAuth key file ownership issues causing "Key path does not exist or is not readable" errors (Issue #689)
🔗 Release Information
📦 [0.3.5] - August 12, 2025
Fixed
- OAuth client authentication failures with "This password does not use the Bcrypt algorithm" error (Issue #675)
- Laravel Passport 13 client secret validation by updating plain text secrets to bcrypt format
- Production API authentication issues for OAuth clients with legacy plain text secrets
- Docker builds failing on Debian Trixie due to nginx.org repository compatibility
- Integration test failures by adding HTTP support alongside HTTPS in nginx configuration
Added
oauth:fix-client-secretsartisan command to safely update OAuth client secrets to bcrypt format- Database migration to automatically fix OAuth client secret format during deployment
- Dry-run mode for OAuth client secret fix command with safety confirmations
🔗 Release Information
📦 [0.3.4] - August 8, 2025
Added
- Comprehensive PROJECT_OVERVIEW.md markdown description file with strategic business and technical analysis (Issue #648)
🔗 Release Information
📦 [0.3.2] - August 8, 2025
Fixed
- Version script master branch logic simplified to use reliable git tag-based versioning instead of fragile commit message parsing (Issue #666)
🔗 Release Information
📦 [0.3.1] - August 8, 2025
Added
- Comprehensive version script test suite in
build/tests/with validation for all branch scenarios - Version script validation integrated into lint checks (
npm run lint:version) ./build/scripts/test-versionunified test runner for version script validation- Improved npm test scripts:
npm testnow runs PHP tests and version script validation (CI-safe)
Changed
- Update CHANGELOG.md for version script hotfix
- Auto-update OpenAPI documentation
Fixed
- Fix version script tests for CI environments
- Fix version script tag selection to prefer higher version numbers
- Fix version script conditional logic bug and add comprehensive tests
- Critical version script bug: Fixed conditional logic in
build/version.shwhere line 61 was overwriting release branch version extraction (Issue #662) - Version synchronization between release branches and actual release versions
- Release branch version extraction now properly uses branch names (e.g.,
release/0.3.0→0.3.0)
🔗 Release Information
📦 [0.3.0] - August 7, 2025
Added
- Bruno API testing collection with comprehensive endpoint coverage and CI/CD validation
- OAuth integration tests with automatic token management and authentication flow validation
- Complete OpenAPI 3.0 documentation with interactive Swagger UI
- OpenAPI schema definitions for all API resources in
/app/OpenApi/Schemas.php - L5-Swagger integration for automatic documentation generation
- GitHub Actions workflow for automated documentation validation and deployment
- Makefile commands:
make docs,make docs-validate,make help - Public documentation directory
/public/docs/with usage examples - V1 namespaced controllers with complete OpenAPI documentation for versioned endpoints
- Complete documentation generation system with automated repository documentation from OpenAPI specifications
Changed
- All API endpoints now include comprehensive OpenAPI attributes
- Updated L5-Swagger configuration for optimal documentation generation
- Enhanced README with OpenAPI documentation section
- V1 routes now use dedicated V1 controllers in
App\Http\Controllers\V1namespace - OpenAPI documentation includes both legacy and V1 versioned endpoints with separate tags
make changelog-updatecommand now also updates OpenAPI documentation to ensure version consistency- User-friendly development scripts with comprehensive output and error handling moved to
build/scripts/ - Removed obsolete gulp build system, Postman tooling, and legacy file references for simplified development workflow
🔗 Release Information
📦 [0.2.85] - July 27, 2025
Added
- New
make release-notes-previewcommand to preview GitHub release notes before merging - Enhanced GitHub release notes with clean, organized format and quick navigation
- Dedicated "Issues Fixed" section in release notes with clickable GitHub issue links
- Claude API integration for intelligent release summary generation based on commits, file changes, and changelog content
Changed
- GitHub release notes now use curated changelog content instead of raw commit messages
- Release notes structure improved with sections for Summary, What's Changed, Links & Resources, and Deployment
- Docker image links now included directly in release notes for easy access
🔗 Release Information
📦 [0.2.84] - July 26, 2025
Added
- Added
make changelog-updatecommand to automatically organize changelog with next version - Added
make changelog-previewcommand to see next version and current unreleased changes - Added changelog requirements to pull request template
- Added
--masterflag to version script to simulate master branch version
Changed
- Modified build process to remove automatic changelog commits during merge conflicts
- Updated changelog maintenance to manual process with make commands for organization
- Updated documentation (CLAUDE.md and VERSION_MANAGEMENT.md) to explain changelog workflow
- Removed automatic changelog commits from build workflow entirely
Fixed
- Resolved merge conflict issues caused by automated changelog updates
- Fixed recursive changelog generation that included meta-commits
🔗 Release Information
📦 [0.2.83] - July 27, 2025
Fixed
- fix: modify how changelog gets updated
🔗 Release Information
📦 [0.2.82] - July 27, 2025
Changed
- chore: cleanup changelog entries
🔗 Release Information
📦 [0.2.81] - July 27, 2025
Added
- API versioning strategy with URL path versioning (
/v1/) - Version information endpoint (
/version) - Dynamic version generation from Git using
build/version.sh - Synchronized versioning across application, API, and CI/CD
- Comprehensive changelog documentation
🔗 Release Information
📦 [0.2.80] - July 27, 2025
Fixed
- fix: fix the release process
🔗 Release Information
📦 [0.2.79] - July 27, 2025
Fixed
- fix: fix docker image tagging process
🔗 Release Information
📦 [0.2.78] - July 27, 2025
Added
- feat: add API versioning with v1 endpoints
- #611 Add tests for new routes
- #611 Add versioning support to the api
Changed
- Merge pull request #616 from cardtechie/feature/611-change-versioning
- #611: Automate document updates
- Merge branch 'master' into feature/611-change-versioning
- #611 Dynamically figure out the version
Fixed
- Fix: Fix process with generation of version number
- #611 Fix failing tests on github
🔗 Release Information
📦 [0.2.73+] - January 26, 2024
Added
- Pre-release API with comprehensive trading card management
- Core endpoints: cards, sets, players, teams, genres, years, manufacturers, brands
- OAuth2 authentication with Laravel Passport 13
- JSON:API specification compliance
- UUID primary keys for all models
- Polymorphic OnCard relationships (Players, Teams, PlayerTeams)
- Automatic card name generation with format tokens (
%d,%o,%l,%a,%s) - Soft delete functionality via Laravel observers
- Docker containerization with multi-environment support
- OpenAPI/Swagger documentation
- Comprehensive test suite (PHPUnit, linting, code standards)
- GitHub Actions CI/CD pipeline
Technical Details
- Framework: Laravel 12 with PHP 8.2+
- Database: MySQL 8.0 with UUID primary keys
- Authentication: Laravel Passport 13 OAuth2
- API Standard: JSON:API specification compliance
- Testing: PHPUnit 11, PHP CodeSniffer, OpenAPI validation
- Containerization: Docker with development, testing, and production environments
Endpoints
GET|POST /cards- Card managementGET|POST /sets- Set management with checklist supportGET|POST /players- Player managementGET|POST /teams- Team managementGET|POST /playerteams- Player-team relationship managementGET|POST /attributes- Card attribute managementGET|POST /object-attributes- Object attribute relationshipsGET|POST /genres- Genre management with soft delete supportGET|POST /years- Year managementGET|POST /manufacturers- Manufacturer managementGET|POST /brands- Brand managementGET /stats/{type}- Statistics endpoint
Security
- OAuth2 client credentials flow
- Environment-based configuration
- SSL/TLS support with Let's Encrypt
- No sensitive data in repository
🔗 Release Information
📊 Release Statistics
- Latest Stable: 0.7.46
- Total Releases: 92+ releases since inception
- Release Frequency: Weekly updates with patches, monthly for minor versions
🔗 Additional Resources
📖 API Documentation
- API Endpoints - Complete endpoint reference
- Data Models - Response structure documentation
- Rate Limits - Usage limits and best practices
- Authentication - Setup and configuration
🐙 GitHub Resources
- API Repository - Source code and technical details
- All Releases - Complete release history
- Issues & Bug Reports - Report API issues
- Pull Requests - View ongoing development
🛠️ Development Tools
- API Explorer - Interactive API testing
- SDKs - Official client libraries
- OpenAPI Specification - Technical API specification
🏷️ Version Information
- Current API Version: 0.7.46
- API Base URL:
https://api.tradingcardapi.com - Release Schedule: Continuous deployment with semantic versioning
- Support Policy: Latest 3 major versions supported
🔔 Stay Updated
📧 Get Notified
- GitHub Watch - Get notified of new API releases
- Email Newsletter - Monthly API updates
- Developer Blog - Technical articles and release announcements
💬 Community & Support
- GitHub Discussions - Ask questions about API functionality
- Email Support - Direct technical support
- Status Page - API uptime and incident reports
Questions About a Release?
Have questions about a specific API change or need help upgrading? We're here to help! Reach out through GitHub Issues or email support.
Automated Updates
This changelog is regularly updated with the latest API releases. For real-time updates, follow the API repository on GitHub.
Last updated: January 5, 2026 at 05:19 AM UTC