# Read domain information

> Read everything about one domain, or page through every domain in your account to keep your own database in sync.

## GET /api/v1/domains/info

Everything we know about one of your domains. Costs 1 quota point — cheap enough to call on every page load.

**Request**

```http
GET /api/v1/domains/info?domainName=apiname.com
```

**Response — 200**

```json
{
  "domainName": "apiname.com",
  "domainNameIdn": "apiname.com",
  "isIdnName": false,
  "resellerId": "7f3c1a28-9e4b-4c51-b1d2-0a6e5f8c3d94",
  "startDate": "2026-10-30T12:04:17",
  "expirationDate": "2027-10-30T12:04:17",
  "transferDate": "0001-01-01T00:00:00",
  "updatedDate": "2026-10-30T14:22:08",
  "remainingDay": 365,
  "status": "Active",
  "statusCode": "ok",
  "statusReason": "None",
  "rgpStatues": "ok",
  "objectId": "2184796_DOMAIN_COM-VRSN",
  "renewalMode": "AutoRenew",
  "authCode": "aB3!xY9-kL2pQ7",
  "lockStatus": true,
  "privacyProtectionStatus": false,
  "isForwarded": false,
  "useTrusteeContact": false,
  "nameservers": ["tr.apiname.com", "eu.apiname.com"],
  "hosts": [],
  "contacts": [
    {
      "contactType": "Registrant",
      "handle": "D-174829301847",
      "firstName": "Ahmet",
      "lastName": "Yilmaz",
      "companyName": "Apiname Ltd",
      "eMail": "ahmet@apiname.com",
      "address": "Ataturk Caddesi No 12 Kat 3",
      "city": "Istanbul",
      "state": "Istanbul",
      "postalCode": "34100",
      "country": "TR",
      "phoneCountryCode": "90",
      "phone": "5321234567"
    }
  ],
  "additionalAttributes": {}
}
```

**The fields that matter most**

| Field | How to use it |
| --- | --- |
| `status` | The **name** of the status (`Active`, `PendingHold`…). Note that the domain *list* endpoint returns a number here instead. Full table in [Status values](https://www.domainnameapi.com/docs/reference/status-values/). |
| `statusReason` | **Why** it is in that status. This is where you find out that a domain was suspended for unverified contact data (`RddsVerificationPending`) or is waiting on documents. |
| `remainingDay` | Days to expiry. Goes negative once expired. Drive renewal reminders off this. |
| `rgpStatues` | Grace-period state: `ok`, `autoRenewPeriod`, `renewPeriod`, `redemptionPeriod`, `pendingDelete`. **Restore is only possible when this is `redemptionPeriod`.** |
| `authCode` | The current transfer authorisation code. Give it to the customer when they want to transfer away. Treat it as a secret otherwise. |
| `lockStatus` | Transfer lock on or off. |
| `nameservers` | Current delegation. If this is not `tr.apiname.com` / `eu.apiname.com`, the [zones API](https://www.domainnameapi.com/docs/dns-records/) will not serve this domain. |
| `hosts` | Host (glue) records defined under this domain. |
| `contacts` | One entry per role. **Empty array when `useTrusteeContact` is `true`** — the trustee's details are not disclosed. |
| `additionalAttributes` | The `tldAttributes` stored for this domain. |

### renewalMode

Indicates how the domain is set to behave at the end of its term.

| Value | Name | Meaning |
| --- | --- | --- |
| 1 | `AutoRenew` | The domain is renewed at expiry and your balance is charged. The minimum term is normally one year; some extensions only renew in longer increments, and that increment is used. |
| 2 | `AutoExpire` | The domain is not renewed and is dropped at the end of its term. A few registries vary this — for `.at`, a new billing term begins instead and the domain is charged on the renewal date rather than dropped. |
| 3 | `AutoDelete` | The domain is deleted at expiry without entering the registry's auto-renew grace period, so no auto-renewal fee is incurred. |

The default for your account is configured in your reseller panel, under reseller settings. To renew a specific domain explicitly at any time, use `POST /api/v1/domains/renew`.

**Errors**

| Code | Meaning and fix |
| --- | --- |
| `Dna.DomainService:Domain:10007` | Not found — **or found but not yours**. Ownership mismatches are reported as not-found deliberately. |
| `Dna.DomainService:Domain:10005` | Invalid domain name. |

## GET /api/v1/domains

Paged list of the domains in your account. Use it to sync your own database.

**Request — query string**

| Parameter | Default | Notes |
| --- | --- | --- |
| `domainName` | — | Partial-match filter. |
| `statusIds` | — | Comma-separated status **names or numbers**: `Active,WaitingForDocument` or `0,2`. |
| `skipCount` | 0 | Offset. |
| `maxResultCount` | 25 | **Silently capped at 500.** Asking for 1000 gives you 500 — page properly. |
| `sorting` | — | `field asc` or `field desc`. `expirationDate asc` is the useful one for renewal queues. |

```http
GET /api/v1/domains?maxResultCount=100&skipCount=0
    &sorting=expirationDate%20asc
    &statusIds=Active
```

**Response — 200**

```json
{
  "totalCount": 243,
  "items": [
    {
      "domainName": "apiname.com",
      "domainNameIdn": "apiname.com",
      "isIdnName": false,
      "objectClass": "Standard",
      "status": 0,
      "statusCode": "ok",
      "renewalMode": "AutoRenew",
      "startDate": "2026-10-30T12:04:17",
      "expirationDate": "2027-10-30T12:04:17",
      "remainingDay": 365,
      "transferDate": null,
      "updatedDate": "2026-10-30T14:22:08",
      "rgpExpirationDate": null,
      "agpExpirationDate": null,
      "lockStatus": true,
      "privacyProtectionStatus": false,
      "contacts": {
        "Registrant": "D-174829301847",
        "Admin": "D-174829301847",
        "Tech": "D-174829301847",
        "Billing": "D-174829301847"
      },
      "nameservers": [
        { "name": "tr.apiname.com", "isChildnameServer": false,
          "isGlueRecord": false, "isLinked": false },
        { "name": "eu.apiname.com", "isChildnameServer": false,
          "isGlueRecord": false, "isLinked": false }
      ]
    }
  ]
}
```

:::caution[Two differences from `/info`]
- `status` here is a **number** (`0` = Active), while `/info` returns the name (`"Active"`). Handle both.
- `contacts` here is a **map of role to handle code**, not full contact details. It is `null` for trustee domains. Use it to see which handles are in play, then call `/info` or the contacts API for detail.
:::

:::tip[Syncing efficiently]
Page with `skipCount` and `maxResultCount=500`, sorted by `expirationDate asc`. Use `totalCount` to know when to stop. This is one call per 500 domains at 10 points each — far cheaper than calling `/info` per domain.
:::

**Errors**

| Code | Meaning and fix |
| --- | --- |
| `Dna.DomainService:Domain:1019` | An entry in `statusIds` is not a valid status. |
| `Dna.DomainService:Domain:10034` | `sorting` names a field that cannot be sorted on. |
