# Check a listing again

- **OpenAPI Version:** `3.2.0`
- **API Version:** `3.1.0`
- **Contact:** Syndai <https://syndai.ai>

## Contents

**Operations**

- [POST /api/v1/external/coding/customers/{customer\_id}/seo/sites/{site\_id}/listings/{key}/check](#scalar-operation-post-apiv1externalcodingcustomerscustomer-idseositessite-idlistingskeycheck)

**Schemas**

- [SeoListingsRead](#scalar-schema-seolistingsread)
- [SeoListingFactsRead](#scalar-schema-seolistingfactsread)
- [SeoGoogleListingRead](#scalar-schema-seogooglelistingread)
- [SeoListingKitRead](#scalar-schema-seolistingkitread)
- [SeoListingPlaceRead](#scalar-schema-seolistingplaceread)
- [SeoLinkCheckRead](#scalar-schema-seolinkcheckread)
- [SeoListingProfileRead](#scalar-schema-seolistingprofileread)
- [SeoListingSampleGateRead](#scalar-schema-seolistingsamplegateread)
- [ProblemDetail](#scalar-schema-problemdetail)
- [ExternalErrorCode](#scalar-schema-externalerrorcode)

<a id="scalar-context-global-servers"></a>

## Servers

- **URL:** `https://api.syndai.ai`

<a id="scalar-context-global-authentication"></a>

## Authentication

- **CustomerApiKey**: HTTP bearer (`API Key`)

  Customer API key sent as a bearer token

## Tags

### Sites

Beta: may change without notice. Websites connected for search and AI visibility: connect a site, link it to Google Search Console, read its SEO tab, show or hide it on Google, and run a priced Ask AI check of how assistants answer about it.

## Operations

<a id="scalar-operation-post-apiv1externalcodingcustomerscustomer-idseositessite-idlistingskeycheck"></a>

### Check a listing again

- **Method:** `POST`
- **Path:** `/api/v1/external/coding/customers/{customer_id}/seo/sites/{site_id}/listings/{key}/check`
- **Operation ID:** `checkSiteListing`
- **Tags:** Sites

`google_business` (a local site): reads Google's public profile of the business: claimed, permanently closed, rating and review count, and up to 3 fixes where it disagrees with the site, at most once per 24 hours. A checkable place: reads the owner's listing page and reports whether it links to the site, whether the link is followed and whether the page can be indexed, at most once per 10 minutes. A second press inside the window returns the stored result. Syndai pays; nothing is charged. A place with no address is 422 `listing_url_missing` (nothing fetched); a read that gets no answer is 502 `listing_check_failed` (the stored check is kept). Returns the Listings section. A key the site can't check is 404. Needs `coding:apps:publish`; a portal member who is not an owner or admin is 403.

**Servers:** [Inherited servers](#scalar-context-global-servers)

**Authentication:** [Global authentication](#scalar-context-global-authentication)

#### Path parameters

- **`customer_id` (required)**: `string`, format: `uuid`
- **`site_id` (required)**: `string`, format: `uuid`
- **`key` (required)**: `string`

#### Responses

##### 200 Request fulfilled, document follows

**Content type:** `application/json`

[SeoListingsRead](#scalar-schema-seolistingsread)

<a id="scalar-example-1"></a>

**Generated example:**

```json
{
  "facts": {
    "address": "",
    "hours": "",
    "missing": [
      ""
    ],
    "name": "",
    "phone": "",
    "website": ""
  },
  "google": {
    "checked_at": "",
    "fixes": [
      ""
    ],
    "rating": 1,
    "review_link": "",
    "reviews": 1,
    "status": ""
  },
  "kind": "",
  "kit": {
    "description": "",
    "name": "",
    "one_liner": "",
    "tagline": "",
    "tags": [
      ""
    ],
    "website": ""
  },
  "places": [
    {
      "aggregator": true,
      "blurb": "",
      "can_fill": true,
      "catch": "",
      "check": {
        "anchor": "",
        "checked_at": "",
        "code": 1,
        "indexable": true,
        "rel": [
          ""
        ],
        "state": "",
        "target_host": "",
        "url": ""
      },
      "checkable": true,
      "group": "",
      "key": "",
      "name": "",
      "paid_upgrade": true,
      "state": "",
      "submit_url": "",
      "visitors_30d": 1
    }
  ],
  "profiles": [
    {
      "key": "",
      "name": "",
      "on_site": true,
      "shape_hint": "",
      "url": ""
    }
  ],
  "review_link": "",
  "sample_gate": {
    "facts": [
      ""
    ],
    "repository_id": ""
  }
}
```

##### 400, 401, 403, 404

- `400` Bad request syntax or unsupported method
- `401` Invalid or missing customer API key
- `403` Insufficient scope or forbidden customer access
- `404` Resource not found

**Content type:** `application/problem+json`

[ProblemDetail](#scalar-schema-problemdetail)

RFC 7807 problem detail returned for public CaaS errors.

<a id="scalar-example-2"></a>

**Generated example:**

```json
{
  "code": "BUDGET_EXHAUSTED",
  "detail": null,
  "existing_run_id": null,
  "instance": null,
  "status": 1,
  "title": "",
  "type": "about:blank",
  "additionalProperty": "anything"
}
```

##### 429 Rate limit exceeded

**Headers:**

- **`Retry-After`**

  Seconds to wait before retrying the request

  `integer`

**Content type:** `application/problem+json`

[ProblemDetail](#scalar-schema-problemdetail)

RFC 7807 problem detail returned for public CaaS errors.

[Generated example](#scalar-example-2)

##### default Unexpected error

**Content type:** `application/problem+json`

[ProblemDetail](#scalar-schema-problemdetail)

<a id="scalar-example-3"></a>

**Generated example:**

```json
null
```

## Schemas

<a id="scalar-schema-seolistingsread"></a>

### SeoListingsRead

**Type:** `object`

- **`places` (required)**: array of [SeoListingPlaceRead](#scalar-schema-seolistingplaceread)
- **`profiles` (required)**: array of [SeoListingProfileRead](#scalar-schema-seolistingprofileread)
- **`facts`**: [SeoListingFactsRead](#scalar-schema-seolistingfactsread) | `null`
- **`google`**: [SeoGoogleListingRead](#scalar-schema-seogooglelistingread) | `null`
- **`kind`**: `string | null`
- **`kit`**: [SeoListingKitRead](#scalar-schema-seolistingkitread) | `null`
- **`review_link`**: `string | null`
- **`sample_gate`**: [SeoListingSampleGateRead](#scalar-schema-seolistingsamplegateread) | `null`

<a id="scalar-example-4"></a>

**Generated example:**

```json
{
  "facts": {
    "address": "",
    "hours": "",
    "missing": [
      ""
    ],
    "name": "",
    "phone": "",
    "website": ""
  },
  "google": {
    "checked_at": "",
    "fixes": [
      ""
    ],
    "rating": 1,
    "review_link": "",
    "reviews": 1,
    "status": ""
  },
  "kind": "",
  "kit": {
    "description": "",
    "name": "",
    "one_liner": "",
    "tagline": "",
    "tags": [
      ""
    ],
    "website": ""
  },
  "places": [
    {
      "aggregator": true,
      "blurb": "",
      "can_fill": true,
      "catch": "",
      "check": {
        "anchor": "",
        "checked_at": "",
        "code": 1,
        "indexable": true,
        "rel": [
          ""
        ],
        "state": "",
        "target_host": "",
        "url": ""
      },
      "checkable": true,
      "group": "",
      "key": "",
      "name": "",
      "paid_upgrade": true,
      "state": "",
      "submit_url": "",
      "visitors_30d": 1
    }
  ],
  "profiles": [
    {
      "key": "",
      "name": "",
      "on_site": true,
      "shape_hint": "",
      "url": ""
    }
  ],
  "review_link": "",
  "sample_gate": {
    "facts": [
      ""
    ],
    "repository_id": ""
  }
}
```

<a id="scalar-schema-seolistingfactsread"></a>

### SeoListingFactsRead

**Type:** `object`

- **`missing` (required)**: `array of string`
- **`address`**: `string | null`
- **`hours`**: `string | null`
- **`name`**: `string | null`
- **`phone`**: `string | null`
- **`website`**: `string | null`

<a id="scalar-example-5"></a>

**Generated example:**

```json
{
  "address": "",
  "hours": "",
  "missing": [
    ""
  ],
  "name": "",
  "phone": "",
  "website": ""
}
```

<a id="scalar-schema-seogooglelistingread"></a>

### SeoGoogleListingRead

**Type:** `object`

- **`fixes` (required)**: `array of string`
- **`status` (required)**: `string`
- **`checked_at`**: `string | null`
- **`rating`**: `number | null`
- **`review_link`**: `string | null`
- **`reviews`**: `integer | null`

<a id="scalar-example-6"></a>

**Generated example:**

```json
{
  "checked_at": "",
  "fixes": [
    ""
  ],
  "rating": 1,
  "review_link": "",
  "reviews": 1,
  "status": ""
}
```

<a id="scalar-schema-seolistingkitread"></a>

### SeoListingKitRead

**Type:** `object`

- **`description` (required)**: `string`
- **`name` (required)**: `string`
- **`one_liner` (required)**: `string`
- **`tagline` (required)**: `string`
- **`tags` (required)**: `array of string`
- **`website` (required)**: `string`

<a id="scalar-example-7"></a>

**Generated example:**

```json
{
  "description": "",
  "name": "",
  "one_liner": "",
  "tagline": "",
  "tags": [
    ""
  ],
  "website": ""
}
```

<a id="scalar-schema-seolistingplaceread"></a>

### SeoListingPlaceRead

**Type:** `object`

- **`aggregator` (required)**: `boolean`
- **`blurb` (required)**: `string`
- **`can_fill` (required)**: `boolean`
- **`catch` (required)**: `string`
- **`checkable` (required)**: `boolean`
- **`group` (required)**: `string`
- **`key` (required)**: `string`
- **`name` (required)**: `string`
- **`paid_upgrade` (required)**: `boolean`
- **`state` (required)**: `string`
- **`submit_url` (required)**: `string`
- **`visitors_30d` (required)**: `integer`
- **`check`**: [SeoLinkCheckRead](#scalar-schema-seolinkcheckread) | `null`

<a id="scalar-example-8"></a>

**Generated example:**

```json
{
  "aggregator": true,
  "blurb": "",
  "can_fill": true,
  "catch": "",
  "check": {
    "anchor": "",
    "checked_at": "",
    "code": 1,
    "indexable": true,
    "rel": [
      ""
    ],
    "state": "",
    "target_host": "",
    "url": ""
  },
  "checkable": true,
  "group": "",
  "key": "",
  "name": "",
  "paid_upgrade": true,
  "state": "",
  "submit_url": "",
  "visitors_30d": 1
}
```

<a id="scalar-schema-seolinkcheckread"></a>

### SeoLinkCheckRead

**Type:** `object`

- **`anchor` (required)**: `string`
- **`code` (required)**: `integer`
- **`rel` (required)**: `array of string`
- **`state` (required)**: `string`
- **`url` (required)**: `string`
- **`checked_at`**: `string | null`
- **`indexable`**: `boolean | null`
- **`target_host`**: `string | null`

<a id="scalar-example-9"></a>

**Generated example:**

```json
{
  "anchor": "",
  "checked_at": "",
  "code": 1,
  "indexable": true,
  "rel": [
    ""
  ],
  "state": "",
  "target_host": "",
  "url": ""
}
```

<a id="scalar-schema-seolistingprofileread"></a>

### SeoListingProfileRead

**Type:** `object`

- **`key` (required)**: `string`
- **`name` (required)**: `string`
- **`on_site` (required)**: `boolean`
- **`shape_hint` (required)**: `string`
- **`url`**: `string | null`

<a id="scalar-example-10"></a>

**Generated example:**

```json
{
  "key": "",
  "name": "",
  "on_site": true,
  "shape_hint": "",
  "url": ""
}
```

<a id="scalar-schema-seolistingsamplegateread"></a>

### SeoListingSampleGateRead

**Type:** `object`

- **`facts` (required)**: `array of string`
- **`repository_id` (required)**: `string`

<a id="scalar-example-11"></a>

**Generated example:**

```json
{
  "facts": [
    ""
  ],
  "repository_id": ""
}
```

<a id="scalar-schema-problemdetail"></a>

### ProblemDetail

**Type:** `object`

RFC 7807 problem detail returned for public CaaS errors.

- **`code` (required)**: `string`, possible values: `"BUDGET_EXHAUSTED", "QUOTA_EXCEEDED", "RUN_CONCURRENCY_LIMIT", "CUSTOMER_DISABLED", "REPO_NOT_BOUND", "IDEMPOTENCY_REPLAY", "CONFLICT", "MISSION_BUSY_RETRY", "HITL_REQUEST_CONFLICT", "HITL_REQUEST_SETTLED", "RUN_TERMINATED_BEFORE_RESPONSE", "INVALID_POLICY", "INVALID_SCOPE", "RATE_LIMITED", "INSTALLATION_INCOMPLETE", "SUBSCRIPTION_USAGE_UNAVAILABLE", "INVALID_TOKEN", "ROLE_REQUIRED", "PLAN_UPGRADE_REQUIRED", "EMAIL_MISMATCH", "EXPIRED_TOKEN", "NOT_FOUND", "OVERSCOPE_ACK_REQUIRED", "VERIFY_FAILED", "PUBLISH_IN_FLIGHT", "PUBLISH_UNSUPPORTED_REPO", "PUBLICATION_NOT_LIVE", "NO_APP_DATA", "FEATURE_REQUESTS_NEEDS_MEMBERS", "EMPTY_UPDATE", "BAD_CURSOR", "HUMAN_APPROVAL_REQUIRED", "PROTECTED_PATHS_MANAGED_ONLY", "RUN_IN_FLIGHT", "TEXT_EDIT_REFUSED", "CLI_UPGRADE_REQUIRED", "PRODUCTION_STEP_UP_REQUIRED", "PRICES_UPDATING", "GITHUB_UNAVAILABLE", "PUBLISH_NOT_SET_UP", "PUBLISH_TAG_EXISTS", "PUBLISH_VERSION_EXISTS", "VERSION_NOT_DEPLOYED", "DATA_REFUSED", "INTERNAL_ERROR"`

  Stable error codes surfaced to public CaaS clients.
- **`status` (required)**: `integer`
- **`title` (required)**: `string`
- **`detail`**: `string | null`, default: `null`
- **`existing_run_id`**: `string | null`, default: `null`
- **`instance`**: `string | null`, default: `null`
- **`type`**: `string`, default: `"about:blank"`

<a id="scalar-example-12"></a>

**Generated example:**

```json
{
  "code": "BUDGET_EXHAUSTED",
  "detail": null,
  "existing_run_id": null,
  "instance": null,
  "status": 1,
  "title": "",
  "type": "about:blank",
  "additionalProperty": "anything"
}
```

<a id="scalar-schema-externalerrorcode"></a>

### ExternalErrorCode

**Type:** `string`, possible values: `"BUDGET_EXHAUSTED", "QUOTA_EXCEEDED", "RUN_CONCURRENCY_LIMIT", "CUSTOMER_DISABLED", "REPO_NOT_BOUND", "IDEMPOTENCY_REPLAY", "CONFLICT", "MISSION_BUSY_RETRY", "HITL_REQUEST_CONFLICT", "HITL_REQUEST_SETTLED", "RUN_TERMINATED_BEFORE_RESPONSE", "INVALID_POLICY", "INVALID_SCOPE", "RATE_LIMITED", "INSTALLATION_INCOMPLETE", "SUBSCRIPTION_USAGE_UNAVAILABLE", "INVALID_TOKEN", "ROLE_REQUIRED", "PLAN_UPGRADE_REQUIRED", "EMAIL_MISMATCH", "EXPIRED_TOKEN", "NOT_FOUND", "OVERSCOPE_ACK_REQUIRED", "VERIFY_FAILED", "PUBLISH_IN_FLIGHT", "PUBLISH_UNSUPPORTED_REPO", "PUBLICATION_NOT_LIVE", "NO_APP_DATA", "FEATURE_REQUESTS_NEEDS_MEMBERS", "EMPTY_UPDATE", "BAD_CURSOR", "HUMAN_APPROVAL_REQUIRED", "PROTECTED_PATHS_MANAGED_ONLY", "RUN_IN_FLIGHT", "TEXT_EDIT_REFUSED", "CLI_UPGRADE_REQUIRED", "PRODUCTION_STEP_UP_REQUIRED", "PRICES_UPDATING", "GITHUB_UNAVAILABLE", "PUBLISH_NOT_SET_UP", "PUBLISH_TAG_EXISTS", "PUBLISH_VERSION_EXISTS", "VERSION_NOT_DEPLOYED", "DATA_REFUSED", "INTERNAL_ERROR"`

Stable error codes surfaced to public CaaS clients.
