{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"PERS API Changelog"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"pers-api-changelog","__idx":0},"children":["PERS API Changelog"]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Public changelog for the PERS Platform API."," ","Tracking started April 2026."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Current Version:"]}," 2.0.56"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"v2056---2026-08-19","__idx":1},"children":["v2.0.56 - 2026-08-19"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features","__idx":2},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ownerBusinessId field to campaigns, redemptions, and token metadata for business ownership tracking"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ?include=ownerBusiness query parameter to load owner business entity on campaigns, redemptions, and token metadata"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ?ownerBusinessId filter parameter to campaigns, redemptions, and token metadata endpoints"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"️-breaking-changes","__idx":3},"children":["⚠️ Breaking Changes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Deprecated CampaignBusinessEngagement - use TriggerSource.businessId for business participation instead"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Updated ?include=businesses to extract business IDs from TriggerSources instead of deprecated CampaignBusinessEngagement"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-07-10","__idx":4},"children":["2026-07-10"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-1","__idx":5},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["New attribution tracking for analytics across all entities (users, claims, redemptions, bookings)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements","__idx":6},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Auto-detects channel/source from User-Agent and Referer headers"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["SDK can send x-source-* headers for campaign/medium tracking"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Standalone serverless function for booking operations"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Users now have registrationSource field for analytics"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-05-18","__idx":7},"children":["2026-05-18"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-1","__idx":8},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Renamed \"reservation\" terminology to \"booking\" for redemption eligibility requirements"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Simplified booking requirement types: 'active', 'future', 'past', 'active_future', 'any' (no 'none')"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Redemptions now return userInfo and booking data via ?include=userInfo,booking"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["GET /bookings endpoint now supports userId and businessId query filters"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Analytics endpoints now support ownerBusinessId filter for business-specific reporting"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["User analytics endpoint now returns totalClaims, totalRedemptions, totalBurns metrics"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Analytics results now include campaign/redemption names and owner business ID automatically"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-29","__idx":9},"children":["2026-04-29"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-2","__idx":10},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added metadataUri field to transactions for tracking IPFS/storage URLs of NFT metadata"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added structured error codes for token refresh failures (REFRESH_TOKEN_EXPIRED, REFRESH_TOKEN_REVOKED)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added PUT and DELETE endpoints for redemption types"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-2","__idx":11},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved DPoP clock tolerance for corporate environments (10 min past, 5 min future)"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-26","__idx":12},"children":["2026-04-26"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-3","__idx":13},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added dateFrom and dateTo query filters to campaign claims and redemption redeems endpoints"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added multi-tag filtering (OR match) with tags parameter on campaigns, redemptions, and businesses"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added search parameter to GET /businesses endpoint"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added isActive option for immediate activation when creating redemptions and token metadata"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-bug-fixes","__idx":14},"children":["🐛 Bug Fixes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed PUT /users/me, POST /users/info, and PUT /users/:identifier to return virtual wallets"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed date parameter validation - invalid date formats now return 400 Bad Request"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-24","__idx":15},"children":["2026-04-24"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-4","__idx":16},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added startDate, endDate, and terms fields to Redemption entity"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added registrationNumber field to Business entity for company registration/VAT numbers"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added startDate and endDate query filters to GET /campaigns and GET /redemptions"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added claimCount include option for campaigns (?include=claimCount)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added redeemCount include option for redemptions (?include=redeemCount)"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-3","__idx":17},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved error responses to preserve original error domain instead of inferring from URL path"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-16","__idx":18},"children":["2026-04-16"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-5","__idx":19},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added template interpolation for ERC721 token name/description using {{placeholder}} syntax"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added {{user.firstName}}, {{campaign.name}}, {{business.displayName}}, {{context.xxx}}, {{defaults.xxx}} placeholder support"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added context field to POST /transactions for direct ERC721 mints with template interpolation"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-4","__idx":20},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Template interpolation is free (no AI cost) and instant"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved API documentation for dynamic context and template interpolation in Swagger"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-bug-fixes-1","__idx":21},"children":["🐛 Bug Fixes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed AI prompts now support {{context.xxx}} placeholder interpolation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Fixed allowExternalContextOverwrite not persisting on token metadata update"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-13","__idx":22},"children":["2026-04-13"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-6","__idx":23},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added dynamic context support for ERC721 token generation with AI prompts"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added trigger-based validity for NFT expiry (validityDate, validityEndDate, validityDuration)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["context"]}," field to TriggerSource for admin-defined dynamic data"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["context"]}," field to CampaignClaimRequest for user-provided context"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["context"]}," field to Redemption for admin-defined dynamic data"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["context"]}," field to RedemptionRedeemRequest for user-provided context"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["defaultPromptContext"]}," to TokenMetadata for AI prompt defaults"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-security","__idx":24},"children":["🔐 Security"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowExternalContextOverwrite"]}," to TokenMetadata for security control"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2026-04-12","__idx":25},"children":["2026-04-12"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-7","__idx":26},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["logoUrl"]}," field to Campaign, Business, Redemption DTOs for branding customization"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["projectLogoUrl"]}," field to Tenant DTOs for project branding"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["terms"]}," field to CampaignTrigger for Terms & Conditions support"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-5","__idx":27},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enhanced API documentation for campaign claims with detailed integration guides"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["GET /tenants/me now returns full tenant data for authenticated tenant admins"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["GET /businesses/account/:address now uses wallet-based lookup for multi-chain support"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-security-1","__idx":28},"children":["🔐 Security"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved security for Stripe credential storage with encryption at rest"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"v229---2026-04-01","__idx":29},"children":["v2.2.9 - 2026-04-01"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-new-features-8","__idx":30},"children":["✨ New Features"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Added OIDC discovery endpoint at ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["/.well-known/openid-configuration"]}," for enterprise SSO integration"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"-improvements-6","__idx":31},"children":["🔧 Improvements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Improved platform stability for high-traffic multi-tenant scenarios"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Webhook trigger endpoint now returns structured response with execution metadata (executionId, statusCode, durationMs)"]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]}]},"headings":[{"value":"PERS API Changelog","id":"pers-api-changelog","depth":1},{"value":"v2.0.56 - 2026-08-19","id":"v2056---2026-08-19","depth":2},{"value":"✨ New Features","id":"-new-features","depth":3},{"value":"⚠️ Breaking Changes","id":"️-breaking-changes","depth":3},{"value":"2026-07-10","id":"2026-07-10","depth":2},{"value":"✨ New Features","id":"-new-features-1","depth":3},{"value":"🔧 Improvements","id":"-improvements","depth":3},{"value":"2026-05-18","id":"2026-05-18","depth":2},{"value":"🔧 Improvements","id":"-improvements-1","depth":3},{"value":"2026-04-29","id":"2026-04-29","depth":2},{"value":"✨ New Features","id":"-new-features-2","depth":3},{"value":"🔧 Improvements","id":"-improvements-2","depth":3},{"value":"2026-04-26","id":"2026-04-26","depth":2},{"value":"✨ New Features","id":"-new-features-3","depth":3},{"value":"🐛 Bug Fixes","id":"-bug-fixes","depth":3},{"value":"2026-04-24","id":"2026-04-24","depth":2},{"value":"✨ New Features","id":"-new-features-4","depth":3},{"value":"🔧 Improvements","id":"-improvements-3","depth":3},{"value":"2026-04-16","id":"2026-04-16","depth":2},{"value":"✨ New Features","id":"-new-features-5","depth":3},{"value":"🔧 Improvements","id":"-improvements-4","depth":3},{"value":"🐛 Bug Fixes","id":"-bug-fixes-1","depth":3},{"value":"2026-04-13","id":"2026-04-13","depth":2},{"value":"✨ New Features","id":"-new-features-6","depth":3},{"value":"🔐 Security","id":"-security","depth":3},{"value":"2026-04-12","id":"2026-04-12","depth":2},{"value":"✨ New Features","id":"-new-features-7","depth":3},{"value":"🔧 Improvements","id":"-improvements-5","depth":3},{"value":"🔐 Security","id":"-security-1","depth":3},{"value":"v2.2.9 - 2026-04-01","id":"v229---2026-04-01","depth":2},{"value":"✨ New Features","id":"-new-features-8","depth":3},{"value":"🔧 Improvements","id":"-improvements-6","depth":3}],"frontmatter":{"seo":{"title":"PERS API Changelog"}},"lastModified":"2026-09-09T09:13:01.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/9.changelog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}