# Create a Watcher with a Predefined Service
Source: https://docs.chain.link/crec/guides/watchers/create-with-service
Last Updated: 2026-08-31

> For the complete documentation index, see [llms.txt](/llms.txt).

When the contract you want to monitor is supported by a published CRE Connect service (for example `dta.v2`), use **`watchers.Client.CreateWithService`** instead of `CreateWithABI`. The service ships everything CRE Connect needs to monitor that contract: the ABIs, the event schemas, and the underlying processing pipeline. You only supply the chain selector, address, the event names you want to subscribe to, and (optionally) a `service_config` map.

## When to use this

| You should use `CreateWithService` if...                                      | Otherwise use [`CreateWithABI`](/crec/guides/watchers/create-with-abi) |
| ----------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| The contract is covered by a CRE Connect extension.                           | The contract is custom or not yet supported by an extension.           |
| You want typed event payloads via the extension's `events`/`decode` packages. | You are happy decoding the raw event payload with `Client.Decode`.     |
| You want service-managed defaults (confidence level, polling cadence).        | You need an ad-hoc watcher with no protocol-specific behavior.         |

## Procedure

## Wait for the watcher to become active

A service-based watcher is "active" once CRE Connect has deployed and confirmed it healthy. Use `WaitForActive` to block until the transition completes (or fails):

```go
active, err := client.Watchers.WaitForActive(ctx, channelID, w.WatcherId, 2*time.Minute)
switch {
case errors.Is(err, watchers.ErrWaitForActiveTimeout):
    log.Fatal("watcher took too long to deploy")
case errors.Is(err, watchers.ErrWatcherDeploymentFailed):
    log.Fatal("watcher failed to deploy: check service / address")
case err != nil:
    log.Fatal(err)
}
fmt.Println(active.Status) // -> active
```

`WaitForActive` polls every `Options.PollInterval` (default 2 s; configurable via [`crec.WithWatcherPolling`](/crec/reference/sdk-configuration)) and tolerates `404` responses for `Options.EventualConsistencyWindow` (default 2 s) to absorb propagation lag right after creation.

## What `service_config` accepts

Every service defines its own config schema. The DTA v2 service accepts an empty config in the typical case; specialized scenarios (custom polling cadence, alternative confidence level, additional indexer hints) are covered in the extension's own README. Pass `nil` (Go) or omit the field (REST) when in doubt.

## Next steps

- [Manage Watcher Lifecycle](/crec/guides/watchers/manage-lifecycle): list, update, archive, and inspect status.
- [DTA Subscriptions and Redemptions](/crec/extensions/dta/subscriptions-redemptions): typed examples using the same `dta.v2` service.
- [Verifiable Events](/crec/concepts/verifiable-events): what the watcher actually emits.