> This page is for version 2025-09-18 (default).
> For other versions, use one of these documentation indexes:
> - 2025-09-18 (default): https://apidocs.polytomic.com/2025-09-18/llms.txt
> - 2024-02-08: https://apidocs.polytomic.com/2024-02-08/llms.txt
> - 2023-04-25: https://apidocs.polytomic.com/2023-04-25/llms.txt
> - 2022-12-12: https://apidocs.polytomic.com/2022-12-12/llms.txt
> - 2021-05-23: https://apidocs.polytomic.com/2021-05-23/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://apidocs.polytomic.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://apidocs.polytomic.com/_mcp/server.

# Get Harbor Status

GET https://app.polytomic.com/api/harbors/{harbor_id}/status

Returns raw Polytomic refresh evidence for datasets written to a Harbor.

Each pipeline corresponds to a bulk sync or model sync that writes at least one
dataset to the Harbor's backing Connection. Tables populated outside Polytomic
are not included, even when they are queryable through a customer-managed
backing Connection.

The response groups shared pipeline evidence so schedules and configuration are
not repeated for every dataset:

- Each entry in `pipelines` identifies the producer through `type` and `id`.
  Separate pipelines targeting the same physical dataset remain separate
  entries.
- `datasets` is keyed by the effective destination dataset name.
  `last_success_at` is the start time of the most recent execution in which that
  dataset completed successfully, including a successful dataset within a bulk
  execution that completes with errors. The start time is a conservative upper
  bound because source reads and destination writes happen afterward.
- `latest_status` preserves the latest Polytomic execution status. Never-run
  datasets omit this field.
- Pipeline-level `schedules` preserves schedule parameters and selectors. A
  schedule can be manual, event-driven, advanced, selective, or limited to
  named source schemas, so callers should not reduce the list to one inferred
  cadence.
- Continuous schedules use the scheduler's persisted next firing. If scheduler
  state is unavailable, `next_run_at` is omitted rather than recalculated with
  new jitter.
- Paused pipelines remain present with `refresh_enabled` set to `false` and no
  `next_run_at`.

Use absolute timestamps and the raw statuses to apply the maximum acceptable
staleness for your task. The endpoint does not classify datasets or the Harbor
as healthy, stale, or unhealthy.

Reference: https://apidocs.polytomic.com/api-reference/harbors/get-status

## Authentication

- `Authorization` header (bearer token, required) — Bearer user API key
- `Authorization` header (basic auth, required) — Basic organization-scoped API key

## Request

### Path parameters

- `harbor_id` (string, required) — Unique identifier of the Harbor.

## Response

### 200

OK

- `data` (HarborStatusResponse, required)

## Errors

### 403 Forbidden Error

Forbidden

- `key` (string, optional)
- `message` (string, optional)
- `metadata` (map from string to any, optional)
- `status` (integer, optional)

### 404 Not Found Error

Not Found

- `key` (string, optional)
- `message` (string, optional)
- `metadata` (map from string to any, optional)
- `status` (integer, optional)

### 500 Internal Server Error

Internal Server Error

- `key` (string, optional)
- `message` (string, optional)
- `metadata` (map from string to any, optional)
- `status` (integer, optional)

## Types

### HarborStatusResponse

- `as_of` (datetime, required) — UTC time at which Polytomic assembled this status snapshot.
- `pipelines` (list of HarborPipelineStatusResponse, required, nullable) — Polytomic pipelines that populate datasets in the Harbor backing Connection. Unmanaged tables are excluded.

### HarborPipelineStatusResponse

- `datasets` (map from string to HarborDatasetStatusResponse, required, nullable) — Dataset refresh evidence keyed by the effective destination name visible to Harbor queries.
- `id` (string, required) — Unique identifier of the Polytomic pipeline.
- `refresh_enabled` (boolean, required) — Whether this pipeline is enabled.
- `schedules` (list of HarborStatusScheduleResponse, required) — Exact Polytomic schedules that can select datasets in this pipeline.
- `type` (enum, required) — Type of Polytomic pipeline.
  - Allowed values: `bulk`, `model`

### HarborDatasetStatusResponse

- `error` (string, optional) — Latest raw execution error associated with the dataset, when present.
- `last_success_at` (datetime, optional, nullable) — Start time of the most recent successful dataset refresh. This is a conservative upper bound on data freshness. Completed refreshes with other dataset errors still count as successful for this dataset.
- `latest_status` (string, optional) — Raw status of the latest Polytomic execution that selected this dataset.

### HarborStatusScheduleResponse

- `frequency` (enum, required)
  - Allowed values: `manual`, `continuous`, `hourly`, `daily`, `weekly`, `custom`, `builder`, `runafter`, `multi`, `dbtcloud`
- `connection_id` (string, optional) — External schedule Connection ID, when configured.
- `day_of_month` (string, optional) — Raw day-of-month schedule expression for an advanced schedule, when configured.
- `day_of_week` (string, optional) — Raw day-of-week schedule expression, when configured.
- `hour` (string, optional) — Raw hour schedule expression, when configured.
- `is_default` (boolean, optional) — Whether this is the bulk sync's default schedule.
- `job_id` (integer, optional, nullable) — External job ID for an event-driven model sync schedule, when configured.
- `minute` (string, optional) — Raw minute schedule expression, when configured.
- `month` (string, optional) — Raw month schedule expression for an advanced schedule, when configured.
- `next_run_at` (datetime, optional, nullable) — Next scheduled run time in UTC. Continuous schedules use persisted scheduler state. Omitted for disabled, manual, event-driven, otherwise non-cron, or unavailable scheduler state.
- `run_after_success_only` (boolean, optional, nullable) — Whether a run-after model schedule requires the upstream execution to succeed.
- `schemas` (list of string, optional) — Source schema IDs explicitly selected by this bulk schedule.
- `selective_mode` (enum, optional)
  - Allowed values: `none`, `incrementalFields`, `nonincrementalFields`
- `sync_mode` (enum, optional)
  - Allowed values: `normal`, `refetch`, `resync`, `rebuild`

## Examples

**Response**

```json
{
  "data": {
    "as_of": "2024-01-15T09:30:00Z",
    "pipelines": [
      {
        "datasets": {},
        "id": "248df4b7-aa70-47b8-a036-33ac447e668d",
        "refresh_enabled": true,
        "schedules": [
          {
            "frequency": "manual",
            "connection_id": "248df4b7-aa70-47b8-a036-33ac447e668d",
            "day_of_month": "1-15",
            "day_of_week": "1",
            "hour": "13",
            "is_default": true,
            "job_id": 1,
            "minute": "0",
            "month": "*",
            "next_run_at": "2024-01-15T09:30:00Z",
            "run_after_success_only": true,
            "schemas": [
              "tickets"
            ],
            "selective_mode": "none",
            "sync_mode": "normal"
          }
        ],
        "type": "bulk"
      }
    ]
  }
}
```

**SDK Code**

```python
import requests

url = "https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://app.polytomic.com/api/harbors/248df4b7-aa70-47b8-a036-33ac447e668d/status")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```