---
url: https://docs.dataflair.ai/marketplace/ad-server-api/go-live.md
description: >-
  A checklist to finish before you connect your ad server for real bookings.
  Each item names the problem it prevents.
---

# Go live checklist

Work through this list before real advertisers book your inventory. Each item leads with the problem it prevents.

## Connection

* \[ ] **A rejected connection.** `GET /health` returns a body that DataFlair accepts. The card shows **Connected**, not **Re-verify needed**. See [GET /health](/marketplace/ad-server-api/operations/health).
* \[ ] **A leaked key.** The key is least privilege (read, create-draft and report), it is revocable without downtime, and it is stored hashed on your side. See [Authentication](/marketplace/ad-server-api/authentication).
* \[ ] **A refused base URL.** The base URL starts with `https://`, has no `#` fragment, and resolves to a public address.
* \[ ] **A broken call after a redirect.** Your endpoints answer at the exact base URL, with no redirect. DataFlair does not follow redirects.

## Inventory

* \[ ] **Bookings that start a day early or late.** `timezone` in `/health` is the real IANA timezone your platform books flights in. See [Conventions](/marketplace/ad-server-api/conventions#dates-timezone-and-flights).
* \[ ] **A mapping that breaks.** Each `inventory_id` is stable. You do not reuse an id for a different slot. See [Inventory identity](/marketplace/ad-server-api/inventory).
* \[ ] **A creative that does not fit.** Each slot lists every size it accepts in `sizes`.
* \[ ] **A blocked booking.** `currency` in `/health` matches the currency you book in. DataFlair stops on a mismatch.
* \[ ] **A dead slot that shows as bookable.** A slot you no longer sell returns `status: "archived"`, so DataFlair can hide it.

## Booking

* \[ ] **Inventory that serves before a person approves it.** `POST /orders` creates draft, paused or inactive objects only. It returns `status: "DRAFT"` for the order and every line. See [Draft only](/marketplace/ad-server-api/operations/orders#draft-only).
* \[ ] **A duplicate order.** A repeat of the same `idempotency_key` and body returns the same ids. The same key with a different body returns `409`. A new key with the same `external_ref` updates the existing order and line.
* \[ ] **A lost reconciliation.** `line_item_id` does not change for a booked line, even when a person renames the line in your console.
* \[ ] **A broken click.** You store the creative tag exactly as sent and keep the `/go/{code}` link. See [How creatives work](/marketplace/ad-server-api/operations/orders#how-creatives-work).
* \[ ] **A surprise in your console.** Your ad-ops team knows that DataFlair creates drafts, and that a person must review and activate them.

## Reporting

* \[ ] **Billing on the wrong numbers.** `POST /reports` returns the impressions and clicks that **your ad server** served for each line. It does not return blended totals. See [POST /reports](/marketplace/ad-server-api/operations/reports/).
* \[ ] **A report that cannot be matched.** Each row carries the same `line_item_id` you returned when you created the line.

## Errors and load

* \[ ] **A retry storm.** You return `429` with a `Retry-After` header when you need DataFlair to slow down.
* \[ ] **A failure nobody can read.** Every error has a JSON body with `code` and `message`, and `message` holds no secrets. See [Errors](/marketplace/ad-server-api/errors).
* \[ ] **A slow answer that counts as down.** Each call connects within 10 seconds and finishes within 30. See [Retries and idempotency](/marketplace/ad-server-api/retries-and-idempotency).

## Before you tell DataFlair you are ready

* \[ ] **A surprise about what runs today.** You have read what is live today on the [overview](/marketplace/ad-server-api/overview). DataFlair calls `GET /health` and `GET /inventory` when you connect. It does not call forecast, booking or reporting yet.
* \[ ] **A gap in your own testing.** You have followed [Testing your implementation](/marketplace/ad-server-api/testing).
