# Writing Custom Checks To create a custom check, create a new custom check class: ```cs public class MyCustomCheck : CustomCheck { public MyCustomCheck() : base("SomeId-StartUp", "SomeCategory") { } public override Task PerformCheck(CancellationToken cancellationToken = default) { if (SomeService.GetStatus()) { return CheckResult.Pass; } return CheckResult.Failed("Some service is not available."); } } ``` When the custom check executes, it should return a pass or fail status and, in the case of failure, a descriptive message. This status and descriptive message will be sent to ServiceControl and will appear in the [ServicePulse UI](in-servicepulse.md) and in [ServiceControl integration events](notification-events.md). All custom checks are executed when the endpoint starts up. If the optional interval is specified, the custom check will be executed periodically. ```cs public class MyPeriodicCheck : CustomCheck { public MyPeriodicCheck() : base("SomeId-Periodic", "SomeCategory", TimeSpan.FromSeconds(5)) { } public override Task PerformCheck(CancellationToken cancellationToken = default) { if (SomeService.GetStatus()) { return CheckResult.Pass; } return CheckResult.Failed("Some service is not available."); } } ``` > [!NOTE] > Custom checks are discovered at runtime using assembly scanning. This means they can also be deployed to endpoints as NuGet packages.