# Drop catch
Watched domains.
**Common tasks**
- [List watched domains](#get-organizations-organization-watched-domains)
**Only in the app:** Adding watched domains and placing backorders.
**How it works in the app:** [help article](https://infranest.io/docs/drop-catch).
**Scopes:** Read with `drop-catch.read`. See [Tokens and scopes](../tokens-and-scopes.md#scopes).
[Watched domains](#watched-domains) 8 · [Whois servers](#whois-servers) 1
Every endpoint below takes a token in the `Authorization: Bearer` header and answers JSON. Errors use the shared format in [Errors](../errors.md). Base address: `https://api.infranest.io/api`.
## Watched domains
### List watched domains {#get-organizations-organization-watched-domains}
`GET` `/organizations/{organization}/watched-domains`
**Scope:** `drop-catch.read` · **Changes data:** no
Your watched domains, paginated with `per_page` (default 25, at most 200) and sorted with `sort` and `dir`. Filter with `search`, `tag` and flags such as `active`, `available`, `registered`, `failed`, `paused` and `in_auction`; `meta` carries counts per status.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [
{
"id": 3,
"organization_id": 1,
"name": "northwind",
"tld": "app",
"priority": 5,
"status": "available",
"auto_register": true,
"registrar": null,
"consecutive_available_count": 0,
"notes": null,
"last_checked_at": "2026-01-15T09:00:00.000000Z",
"available_since": null,
"registered_at": null,
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"next_check_at": "2026-01-15T13:00:00.000000Z",
"observed_expires_at": null,
"observed_status": null,
"drop_eta": null,
"date_visibility": null,
"score": 88,
"score_breakdown": null,
"scored_at": "2026-01-15T12:00:00.000000Z",
"registrar_preferences": null,
"lifecycle_stage": "available",
"observed_created_at": null,
"contact_id": null,
"extended_attributes": null,
"catchability": 90,
"catchability_signals": {
"verdict": "available",
"factors": []
},
"dns_signals": null,
"observed_registrar": null,
"observed_updated_at": null,
"observed_nameservers": null,
"lifecycle_progress": null,
"http_signals": null,
"enrichment_signals": null,
"burst_until": null,
"parallel_race": false,
"in_auction": false,
"auction": null,
"backorder": false,
"backorder_credential_id": null,
"backorder_status": null,
"whois_raw_at": null,
"drop_eta_uncertainty_days": null,
"lifecycle_source": null,
"lifecycle_stage_since": "2026-01-10T12:00:00.000000Z",
"published_drop_at": null,
"deleted_at_registry": null,
"dropping_soon_alerted_at": null,
"last_successful_check_at": null,
"consecutive_check_errors": 0,
"check_failing_alerted_at": null,
"funding": null,
"funding_alerted_at": null,
"full_name": "northwind.app",
"drop_score": 5,
"tags": []
},
{
"id": 13,
"organization_id": 1,
"name": "northwind-app",
"tld": "com",
"priority": 5,
"status": "failed",
"auto_register": true,
"registrar": null,
"consecutive_available_count": 0,
"notes": null,
"last_checked_at": "2026-01-15T09:00:00.000000Z",
"available_since": null,
"registered_at": null,
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"next_check_at": "2026-01-15T13:00:00.000000Z",
"observed_expires_at": null,
"observed_status": null,
"drop_eta": null,
"date_visibility": null,
"score": 87,
"score_breakdown": null,
"scored_at": "2026-01-15T12:00:00.000000Z",
"registrar_preferences": null,
"lifecycle_stage": "active",
"observed_created_at": null,
"contact_id": null,
"extended_attributes": null,
"catchability": 30,
"catchability_signals": {
"verdict": "active",
"factors": []
},
"dns_signals": null,
"observed_registrar": null,
"observed_updated_at": null,
"observed_nameservers": null,
"lifecycle_progress": null,
"http_signals": null,
"enrichment_signals": null,
"burst_until": null,
"parallel_race": false,
"in_auction": false,
"auction": null,
"backorder": false,
"backorder_credential_id": null,
"backorder_status": null,
"whois_raw_at": null,
"drop_eta_uncertainty_days": null,
"lifecycle_source": null,
"lifecycle_stage_since": "2026-01-09T12:00:00.000000Z",
"published_drop_at": null,
"deleted_at_registry": null,
"dropping_soon_alerted_at": null,
"last_successful_check_at": null,
"consecutive_check_errors": 0,
"check_failing_alerted_at": null,
"funding": null,
"funding_alerted_at": null,
"full_name": "northwind-app.com",
"drop_score": 5,
"tags": []
}
],
"first_page_url": "http://localhost/api/organizations/1/watched-domains?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost/api/organizations/1/watched-domains?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/watched-domains?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": null,
"path": "http://localhost/api/organizations/1/watched-domains",
"per_page": 25,
"prev_page_url": null,
"to": 16,
"total": 16,
"meta": {
"counts": {
"total": 16,
"active": 13,
"available": 2,
"registered": 1,
"failed": 1,
"paused": 1,
"in_auction": 1,
"not_armed": 8
},
"tags": []
}
}
```
---
### Get a watched domain {#get-organizations-organization-watched-domains-watcheddomain}
`GET` `/organizations/{organization}/watched-domains/{watchedDomain}`
**Scope:** `drop-catch.read` · **Changes data:** no
One watched domain with its stored WHOIS record, lifecycle dates, estimated drop date, the check schedule still ahead and drop statistics for its extension.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `watchedDomain_id`
path · required | integer | The watchedDomain's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/1" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"id": 1,
"organization_id": 1,
"name": "northwind-labs",
"tld": "com",
"priority": 5,
"status": "watching",
"auto_register": false,
"registrar": null,
"consecutive_available_count": 0,
"notes": null,
"last_checked_at": "2026-01-15T09:00:00.000000Z",
"available_since": null,
"registered_at": null,
"deleted_at": null,
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z",
"next_check_at": "2026-01-15T13:00:00.000000Z",
"observed_expires_at": "2025-11-13T12:00:00.000000Z",
"observed_status": null,
"drop_eta": "2026-01-27T12:00:00.000000Z",
"date_visibility": null,
"score": 84,
"score_breakdown": null,
"scored_at": "2026-01-15T12:00:00.000000Z",
"registrar_preferences": null,
"lifecycle_stage": "redemption",
"observed_created_at": null,
"contact_id": null,
"extended_attributes": null,
"catchability": 78,
"catchability_signals": {
"verdict": "likely",
"factors": []
},
"dns_signals": null,
"observed_registrar": null,
"observed_updated_at": null,
"observed_nameservers": null,
"lifecycle_progress": null,
"http_signals": null,
"enrichment_signals": null,
"burst_until": null,
"parallel_race": false,
"in_auction": false,
"auction": null,
"backorder": false,
"backorder_credential_id": null,
"backorder_status": null,
"whois_raw": null,
"whois_raw_at": null,
"drop_eta_uncertainty_days": null,
"lifecycle_source": null,
"lifecycle_stage_since": "2026-01-12T12:00:00.000000Z",
"published_drop_at": null,
"deleted_at_registry": null,
"dropping_soon_alerted_at": null,
"last_successful_check_at": null,
"consecutive_check_errors": 0,
"check_failing_alerted_at": null,
"funding": null,
"funding_alerted_at": null,
"check_logs_count": 0,
"registration_logs_count": 0,
"full_name": "northwind-labs.com",
"drop_score": 5,
"tags": [],
"drop_stats": {
"heuristic": 78,
"probability": null,
"basis_n": 0,
"scope": null,
"phase": "redemption",
"tld": "com"
},
"lifecycle_anchors": {
"registered": null,
"expired": "2025-11-13T12:00:00+00:00",
"redemption": "2025-12-28T12:00:00+00:00",
"pending_delete": "2026-01-27T12:00:00+00:00",
"drop": "2026-02-01T12:00:00+00:00"
},
"measured_samples": null,
"release": null,
"cadence": [
{
"starts_at": null,
"every_seconds": 21600
},
{
"starts_at": "2026-01-25T12:00:00+00:00",
"every_seconds": 3600
}
]
}
```
---
### List availability checks {#get-organizations-organization-watched-domains-watcheddomain-check-logs}
`GET` `/organizations/{organization}/watched-domains/{watchedDomain}/check-logs`
**Scope:** `drop-catch.read` · **Changes data:** no
Every availability check run on the watched domain, newest first, 100 per page. Filter with `status`.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `watchedDomain_id`
path · required | integer | The watchedDomain's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/1/check-logs" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [],
"first_page_url": "http://localhost/api/organizations/1/watched-domains/1/check-logs?page=1",
"from": null,
"last_page": 1,
"last_page_url": "http://localhost/api/organizations/1/watched-domains/1/check-logs?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/watched-domains/1/check-logs?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": null,
"path": "http://localhost/api/organizations/1/watched-domains/1/check-logs",
"per_page": 100,
"prev_page_url": null,
"to": null,
"total": 0
}
```
---
### List registration attempts {#get-organizations-organization-watched-domains-watcheddomain-registration-logs}
`GET` `/organizations/{organization}/watched-domains/{watchedDomain}/registration-logs`
**Scope:** `drop-catch.read` · **Changes data:** no
Every attempt to register the watched domain, newest first, 50 per page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `watchedDomain_id`
path · required | integer | The watchedDomain's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/1/registration-logs" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [],
"first_page_url": "http://localhost/api/organizations/1/watched-domains/1/registration-logs?page=1",
"from": null,
"last_page": 1,
"last_page_url": "http://localhost/api/organizations/1/watched-domains/1/registration-logs?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/watched-domains/1/registration-logs?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": null,
"path": "http://localhost/api/organizations/1/watched-domains/1/registration-logs",
"per_page": 50,
"prev_page_url": null,
"to": null,
"total": 0
}
```
---
### List WHOIS changes {#get-organizations-organization-watched-domains-watcheddomain-whois-changes}
`GET` `/organizations/{organization}/watched-domains/{watchedDomain}/whois-changes`
**Scope:** `drop-catch.read` · **Changes data:** no
Changes detected in the watched domain’s WHOIS record, newest first, 50 per page.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `watchedDomain_id`
path · required | integer | The watchedDomain's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/1/whois-changes" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"current_page": 1,
"data": [
{
"id": 1,
"watched_domain_id": 1,
"field": "status",
"old_value": "clientTransferProhibited",
"new_value": "redemptionPeriod",
"changed_at": "2026-01-11T12:00:00.000000Z"
},
{
"id": 2,
"watched_domain_id": 1,
"field": "expiry",
"old_value": "2026-08-14",
"new_value": "2026-08-14",
"changed_at": "2025-12-20T12:00:00.000000Z"
}
],
"first_page_url": "http://localhost/api/organizations/1/watched-domains/1/whois-changes?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "http://localhost/api/organizations/1/watched-domains/1/whois-changes?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "http://localhost/api/organizations/1/watched-domains/1/whois-changes?page=1",
"label": "1",
"page": 1,
"active": true
}
],
"next_page_url": null,
"path": "http://localhost/api/organizations/1/watched-domains/1/whois-changes",
"per_page": 50,
"prev_page_url": null,
"to": 3,
"total": 3
}
```
---
### Check whether you already hold a domain {#get-organizations-organization-watched-domains-held}
`GET` `/organizations/{organization}/watched-domains/held`
**Scope:** `drop-catch.read` · **Changes data:** no
The domain in your organization matching `name` and `tld` (both required) that you hold or are registering, or null when there is none.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
| `name`
body · required | string | Must not be greater than 63 characters. |
| `tld`
body · required | string | Must not be greater than 63 characters. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/held?name=www&tld=%3Ctld%3E" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"domain": {
"id": 1,
"full_name": "northwind.com",
"status": "active",
"tenure": "held",
"registrar": "Namecheap",
"expires_at": "2026-02-02T00:00:00+00:00",
"auto_renew": true
}
}
```
---
### List registrars for an extension {#get-organizations-organization-watched-domains-registrars}
`GET` `/organizations/{organization}/watched-domains/registrars`
**Scope:** `drop-catch.read` · **Changes data:** no
The connected registrar accounts that can register a caught domain. With `tld`, each says whether it carries that extension and what it charges, and `requirements` lists what the extension asks of a registrant, or null when nothing is on file.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/registrars" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"registrars": [
{
"credential_id": 2,
"provider": "cloudflare",
"provider_name": "Cloudflare",
"provider_label": "Cloudflare DNS",
"supports_tld": null,
"price": null,
"can_race": false
},
{
"credential_id": 3,
"provider": "namecheap",
"provider_name": "Namecheap",
"provider_label": "Namecheap Registrar",
"supports_tld": null,
"price": null,
"can_race": false
}
],
"requirements": null
}
```
---
### List registrars available for catching {#get-organizations-organization-watched-domains-registrars-identities}
`GET` `/organizations/{organization}/watched-domains/registrars/identities`
**Scope:** `drop-catch.read` · **Changes data:** no
The connected registrar accounts that can register a caught domain, by name, and whether each may race for it. Makes no calls to the registrars.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/watched-domains/registrars/identities" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
{
"registrars": [
{
"credential_id": 2,
"provider": "cloudflare",
"provider_name": "Cloudflare",
"provider_label": "Cloudflare DNS",
"can_race": false
},
{
"credential_id": 3,
"provider": "namecheap",
"provider_name": "Namecheap",
"provider_label": "Namecheap Registrar",
"can_race": false
}
]
}
```
## Whois servers
### List custom WHOIS servers {#get-organizations-organization-whois-servers}
`GET` `/organizations/{organization}/whois-servers`
**Scope:** `drop-catch.read` · **Changes data:** no
The WHOIS servers you set per extension to use instead of the default ones, sorted by extension.
| Field | Type | Notes |
|---|---|---|
| `organization_id`
path · required | integer | Your organization's ID. |
**Errors:** [`unauthenticated`](../errors.md#unauthenticated), [`scope_missing`](../errors.md#scope_missing), [`wrong_organization`](../errors.md#wrong_organization), [`test_token_required`](../errors.md#test_token_required), [`test_token_sandbox_only`](../errors.md#test_token_sandbox_only), [`permission_denied`](../errors.md#permission_denied), [`not_found`](../errors.md#not_found), [`rate_limited`](../errors.md#rate_limited)
**Request**
```sh
curl "https://api.infranest.io/api/organizations/42/whois-servers" \
-H "Authorization: Bearer $INFRANEST_TOKEN" \
-H "Accept: application/json"
```
**Response** · 200
```json
[
{
"id": 1,
"organization_id": 1,
"tld": "dev",
"server": "whois.nic.google",
"note": "Override for .dev lookups.",
"created_at": "2026-01-15T12:00:00.000000Z",
"updated_at": "2026-01-15T12:00:00.000000Z"
}
]
```