diff --git a/SVSim.EmulatedEntrypoint/Models/Dtos/PackChildGachaDto.cs b/SVSim.EmulatedEntrypoint/Models/Dtos/PackChildGachaDto.cs
index 509e55a..4d2e446 100644
--- a/SVSim.EmulatedEntrypoint/Models/Dtos/PackChildGachaDto.cs
+++ b/SVSim.EmulatedEntrypoint/Models/Dtos/PackChildGachaDto.cs
@@ -40,4 +40,28 @@ public class PackChildGachaDto
[JsonPropertyName("override_increase_gacha_point")]
[Key("override_increase_gacha_point")]
public string OverrideIncreaseGachaPoint { get; set; } = "0";
+
+ /// Set on type_detail=10 free children only. Emitted as string on the wire.
+ [JsonPropertyName("campaign_name")]
+ [Key("campaign_name")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string? CampaignName { get; set; }
+
+ /// Lifetime claim cap for this campaign. Stringified on the wire ("1") when present.
+ [JsonPropertyName("purchase_limit_count")]
+ [Key("purchase_limit_count")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string? PurchaseLimitCount { get; set; }
+
+ /// Per-UTC-day claim cap for this campaign. Stringified on the wire ("1") when present.
+ [JsonPropertyName("daily_free_gacha_count")]
+ [Key("daily_free_gacha_count")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public string? DailyFreeGachaCount { get; set; }
+
+ /// Campaign id used to scope claim quotas server-side.
+ [JsonPropertyName("free_gacha_campaign_id")]
+ [Key("free_gacha_campaign_id")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public int? FreeGachaCampaignId { get; set; }
}