> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bijection.com/llms.txt
> Use this file to discover all available pages before exploring further.

# X Ads

> Resources, examples, configuration and evidence for X Ads.

Use the `@bijection/connectors/x-ads` entrypoint to declare X Ads resources.

## Availability

This page describes the pinned source package. Published availability is unestablished for this artifact. [Source build and package availability](https://docs.bijection.com/client/sdk-distribution.md).

## Resources and modes

| Resource | Mode | Description |
| - | - | - |
| Ad account and campaign stats | `daily` | Daily synchronous stats settled by X's documented 14-day billing window |

Declare a resource in application code, then bind deployment-specific settings and credentials. See [typed resources](https://docs.bijection.com/integrations/resources.md), [connections](https://docs.bijection.com/integrations/connections.md) and [source inspection](https://docs.bijection.com/integrations/cli.md).

## Ad account and campaign stats

### daily: Daily synchronous stats settled by X's documented 14-day billing window

The following example matches configuration `campaigns`.

```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
import { xAds } from "@bijection/connectors/x-ads";
export const campaignDays = xAds.stats.daily({
  start: "2026-10-01",
  entity: "CAMPAIGN",
  campaignIds: ["8wku2", "8wku3"],
  metricGroups: ["ENGAGEMENT", "BILLING"],
});
```

> **Inferred record types**
>
> ```ts theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> Resource without an operational record table
> ```

#### Configuration: account

Case: `x-ads/stats/daily/account`.

Connection and resource configuration are declared by this exact case.

Credential kind: `x-ads`. Keep credential material in the private credential inventory.

| Setting | Type | Required | Owner |
| - | - | - | - |
| `accountId` | string | Yes | Resource binding |
| `timeZone` | string | Yes | Resource binding |

> **Complete configuration contract**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "setup": [],
>   "resource": {
>     "access": {},
>     "defaults": {},
>     "connector": "x-ads",
>     "output": {
>       "kind": "single",
>       "collection": "stats"
>     },
>     "credential_kind": "x-ads",
>     "connection_fields": [],
>     "address": {
>       "kind": "fixed",
>       "url": "https://ads-api.x.com/"
>     }
>   },
>   "connection_setup": {
>     "type": "object",
>     "value": {
>       "accountId": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       },
>       "timeZone": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       }
>     }
>   },
>   "execution": null
> }
> ```

Native admission analysis is available for this exact declaration.

**Collection: stats**

| Contract | Meaning |
| - | - |
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |

> **Complete native profile**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "movement": {
>     "exchanges": {
>       "stats": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "400": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "401": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "403": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "429": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "503": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       }
>     },
>     "nativeInputLimitBytes": null,
>     "steps": [
>       {
>         "id": "acquire.1",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange stats",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "retain.1",
>         "inputs": [
>           "acquire.1"
>         ],
>         "action": {
>           "operation": "retain",
>           "subject": "acquisition evidence",
>           "reason": "recovery",
>           "release": "acquisition_custody"
>         }
>       },
>       {
>         "id": "interpret.1",
>         "inputs": [
>           "retain.1"
>         ],
>         "action": {
>           "operation": "interpret",
>           "subject": "acquired input",
>           "produces": "records"
>         }
>       },
>       {
>         "id": "materialize.1",
>         "inputs": [
>           "interpret.1"
>         ],
>         "action": {
>           "operation": "materialize",
>           "subject": "source rows",
>           "reason": "serving",
>           "release": "replacement"
>         }
>       },
>       {
>         "id": "publish.1",
>         "inputs": [
>           "materialize.1"
>         ],
>         "action": {
>           "operation": "publish",
>           "subject": "source rows",
>           "visibility": "with_acquisition"
>         }
>       }
>     ]
>   },
>   "initial": "enumeration",
>   "changes": "observations",
>   "deletions": "unsupported",
>   "resume": "none",
>   "retentionMs": null,
>   "gap": "not_applicable",
>   "limits": {
>     "http_response_bytes": "524288"
>   },
>   "restrictions": [],
>   "commands": {}
> }
> ```

> **Commands, occurrences and artifacts**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "records": {
>     "stats": {
>       "protocol": "record_observation",
>       "coverage": "records",
>       "consistency": "observations",
>       "atomicity": "record",
>       "history": "observations",
>       "recordRefresh": false,
>       "reconciliation": false,
>       "notifications": false,
>       "snapshotMaxRows": null,
>       "profile": {
>         "movement": {
>           "exchanges": {
>             "stats": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "400": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "401": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "403": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "429": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "503": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             }
>           },
>           "nativeInputLimitBytes": null,
>           "steps": [
>             {
>               "id": "acquire.1",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange stats",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "retain.1",
>               "inputs": [
>                 "acquire.1"
>               ],
>               "action": {
>                 "operation": "retain",
>                 "subject": "acquisition evidence",
>                 "reason": "recovery",
>                 "release": "acquisition_custody"
>               }
>             },
>             {
>               "id": "interpret.1",
>               "inputs": [
>                 "retain.1"
>               ],
>               "action": {
>                 "operation": "interpret",
>                 "subject": "acquired input",
>                 "produces": "records"
>               }
>             },
>             {
>               "id": "materialize.1",
>               "inputs": [
>                 "interpret.1"
>               ],
>               "action": {
>                 "operation": "materialize",
>                 "subject": "source rows",
>                 "reason": "serving",
>                 "release": "replacement"
>               }
>             },
>             {
>               "id": "publish.1",
>               "inputs": [
>                 "materialize.1"
>               ],
>               "action": {
>                 "operation": "publish",
>                 "subject": "source rows",
>                 "visibility": "with_acquisition"
>               }
>             }
>           ]
>         },
>         "initial": "enumeration",
>         "changes": "observations",
>         "deletions": "unsupported",
>         "resume": "none",
>         "retentionMs": null,
>         "gap": "not_applicable",
>         "limits": {
>           "http_response_bytes": "524288"
>         },
>         "restrictions": [],
>         "commands": {}
>       }
>     }
>   },
>   "occurrences": null,
>   "artifacts": {
>     "raw_archive": false,
>     "native_file_transfer_limit_bytes": null,
>     "external_versions": false,
>     "files": {}
>   },
>   "commands": {}
> }
> ```

**Recorded checks**

| Requirement | Scope | Evidence | Result |
| - | - | - | - |
| page-publication-recovery | \{"kind":"collection","name":"stats"} | Fixture: ./src/connectors/x-ads/fixtures/account-day-settled.json | passed (2026-10-24T21:36:12.544Z) |
| page-publication-recovery | \{"kind":"collection","name":"stats"} | Native test: integrations/acquisition/acquisition\_windows\_preserve\_sequences\_and\_restart\_fences\_old\_work (shared\_engine) | Execution result unavailable |
| backoff-stated-wait | \{"kind":"connection"} | Native test: integrations/acquisition/backoff\_a\_stated\_wait\_defers\_the\_next\_dispatch\_and\_then\_resumes (shared\_engine) | Execution result unavailable |
| identity-account | \{"kind":"connection"} | Fixture: ./src/connectors/x-ads/fixtures/identity.json | passed (2026-10-24T21:36:12.545Z) |

Hosted qualification: **unestablished for this catalog configuration**. Installed connections report their own identity, authority and current status.

#### Configuration: campaigns

Case: `x-ads/stats/daily/campaigns`.

Connection and resource configuration are declared by this exact case.

Credential kind: `x-ads`. Keep credential material in the private credential inventory.

| Setting | Type | Required | Owner |
| - | - | - | - |
| `accountId` | string | Yes | Resource binding |
| `timeZone` | string | Yes | Resource binding |

> **Complete configuration contract**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "setup": [],
>   "resource": {
>     "access": {},
>     "defaults": {},
>     "connector": "x-ads",
>     "output": {
>       "kind": "single",
>       "collection": "stats"
>     },
>     "credential_kind": "x-ads",
>     "connection_fields": [],
>     "address": {
>       "kind": "fixed",
>       "url": "https://ads-api.x.com/"
>     }
>   },
>   "connection_setup": {
>     "type": "object",
>     "value": {
>       "accountId": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       },
>       "timeZone": {
>         "fieldType": {
>           "type": "string"
>         },
>         "optional": false
>       }
>     }
>   },
>   "execution": null
> }
> ```

Native admission analysis is available for this exact declaration.

**Collection: stats**

| Contract | Meaning |
| - | - |
| Initial | Enumeration of observed records |
| Changes | Repeated observations of current records |
| Deletions | Deletion detection unsupported |
| Resume | No continuation |
| Gap | Not applicable |
| Retention | Unspecified |

> **Complete native profile**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "movement": {
>     "exchanges": {
>       "stats": {
>         "200": {
>           "placement": "retained_bytes",
>           "interpretation": "json",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "400": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "401": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "403": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "429": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         },
>         "503": {
>           "placement": "retained_bytes",
>           "interpretation": "opaque",
>           "projectsBeforeRetention": false,
>           "retainedBodyLimitBytes": "524288",
>           "fileLimitBytes": null
>         }
>       }
>     },
>     "nativeInputLimitBytes": null,
>     "steps": [
>       {
>         "id": "acquire.1",
>         "inputs": [],
>         "action": {
>           "operation": "acquire",
>           "subject": "exchange stats",
>           "limitBytes": null
>         }
>       },
>       {
>         "id": "retain.1",
>         "inputs": [
>           "acquire.1"
>         ],
>         "action": {
>           "operation": "retain",
>           "subject": "acquisition evidence",
>           "reason": "recovery",
>           "release": "acquisition_custody"
>         }
>       },
>       {
>         "id": "interpret.1",
>         "inputs": [
>           "retain.1"
>         ],
>         "action": {
>           "operation": "interpret",
>           "subject": "acquired input",
>           "produces": "records"
>         }
>       },
>       {
>         "id": "materialize.1",
>         "inputs": [
>           "interpret.1"
>         ],
>         "action": {
>           "operation": "materialize",
>           "subject": "source rows",
>           "reason": "serving",
>           "release": "replacement"
>         }
>       },
>       {
>         "id": "publish.1",
>         "inputs": [
>           "materialize.1"
>         ],
>         "action": {
>           "operation": "publish",
>           "subject": "source rows",
>           "visibility": "with_acquisition"
>         }
>       }
>     ]
>   },
>   "initial": "enumeration",
>   "changes": "observations",
>   "deletions": "unsupported",
>   "resume": "none",
>   "retentionMs": null,
>   "gap": "not_applicable",
>   "limits": {
>     "http_response_bytes": "524288"
>   },
>   "restrictions": [],
>   "commands": {}
> }
> ```

> **Commands, occurrences and artifacts**
>
> ```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
> {
>   "records": {
>     "stats": {
>       "protocol": "record_observation",
>       "coverage": "records",
>       "consistency": "observations",
>       "atomicity": "record",
>       "history": "observations",
>       "recordRefresh": false,
>       "reconciliation": false,
>       "notifications": false,
>       "snapshotMaxRows": null,
>       "profile": {
>         "movement": {
>           "exchanges": {
>             "stats": {
>               "200": {
>                 "placement": "retained_bytes",
>                 "interpretation": "json",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "400": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "401": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "403": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "429": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               },
>               "503": {
>                 "placement": "retained_bytes",
>                 "interpretation": "opaque",
>                 "projectsBeforeRetention": false,
>                 "retainedBodyLimitBytes": "524288",
>                 "fileLimitBytes": null
>               }
>             }
>           },
>           "nativeInputLimitBytes": null,
>           "steps": [
>             {
>               "id": "acquire.1",
>               "inputs": [],
>               "action": {
>                 "operation": "acquire",
>                 "subject": "exchange stats",
>                 "limitBytes": null
>               }
>             },
>             {
>               "id": "retain.1",
>               "inputs": [
>                 "acquire.1"
>               ],
>               "action": {
>                 "operation": "retain",
>                 "subject": "acquisition evidence",
>                 "reason": "recovery",
>                 "release": "acquisition_custody"
>               }
>             },
>             {
>               "id": "interpret.1",
>               "inputs": [
>                 "retain.1"
>               ],
>               "action": {
>                 "operation": "interpret",
>                 "subject": "acquired input",
>                 "produces": "records"
>               }
>             },
>             {
>               "id": "materialize.1",
>               "inputs": [
>                 "interpret.1"
>               ],
>               "action": {
>                 "operation": "materialize",
>                 "subject": "source rows",
>                 "reason": "serving",
>                 "release": "replacement"
>               }
>             },
>             {
>               "id": "publish.1",
>               "inputs": [
>                 "materialize.1"
>               ],
>               "action": {
>                 "operation": "publish",
>                 "subject": "source rows",
>                 "visibility": "with_acquisition"
>               }
>             }
>           ]
>         },
>         "initial": "enumeration",
>         "changes": "observations",
>         "deletions": "unsupported",
>         "resume": "none",
>         "retentionMs": null,
>         "gap": "not_applicable",
>         "limits": {
>           "http_response_bytes": "524288"
>         },
>         "restrictions": [],
>         "commands": {}
>       }
>     }
>   },
>   "occurrences": null,
>   "artifacts": {
>     "raw_archive": false,
>     "native_file_transfer_limit_bytes": null,
>     "external_versions": false,
>     "files": {}
>   },
>   "commands": {}
> }
> ```

**Recorded checks**

| Requirement | Scope | Evidence | Result |
| - | - | - | - |
| page-publication-recovery | \{"kind":"collection","name":"stats"} | Fixture: ./src/connectors/x-ads/fixtures/campaign-day-provisional.json | passed (2026-10-24T21:36:12.546Z) |
| page-publication-recovery | \{"kind":"collection","name":"stats"} | Native test: integrations/acquisition/acquisition\_windows\_preserve\_sequences\_and\_restart\_fences\_old\_work (shared\_engine) | Execution result unavailable |
| backoff-stated-wait | \{"kind":"connection"} | Native test: integrations/acquisition/backoff\_a\_stated\_wait\_defers\_the\_next\_dispatch\_and\_then\_resumes (shared\_engine) | Execution result unavailable |
| identity-account | \{"kind":"connection"} | Fixture: ./src/connectors/x-ads/fixtures/identity.json | passed (2026-10-24T21:36:12.547Z) |

Hosted qualification: **unestablished for this catalog configuration**. Installed connections report their own identity, authority and current status.

## Provider guidance

Compiled declaration examples and configuration details are published in the [connector reference](https://docs.bijection.com/integrations/connectors/index).

Daily stats from the X Ads API v12 synchronous analytics endpoint
`GET /12/stats/accounts/{account_id}` with `granularity=DAY`, read as restated
report observations (a pass reads through the UTC day it began and carries the
day `restatementDays` before its last day; see `reportWindows.ts`).

## Connection and credential

The connection is fixed at `https://ads-api.x.com/` with credential kind
`x-ads` (`xAds.credential`). X Ads requires OAuth 1.0a HMAC-SHA1 request
signing. The operator configures the credential as a JSON envelope; the recipe
never declares it:

```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
{
  "kind": "oauth1",
  "consumer_key": "<app consumer key>",
  "consumer_secret": "<app consumer secret>",
  "token": "<user access token>",
  "token_secret": "<user access token secret>",
  "allowed_resource_origins": ["https://ads-api.x.com"]
}
```

The host signs every request at dispatch (method, URL, the RFC 3986-encoded
query it sends) and writes `Authorization: OAuth ...`. No request here declares
an `authorization` header or an `oauth_*` query parameter.

Setup names `accountId` (the ads account, such as `18ce54d4x5t`) and
`timeZone`, the account's IANA time zone as `GET /12/accounts/{id}` states it
in `timezone`. Identity is that same read: `data.id` must equal `accountId`.
The account name is not kept.

## What is read

* One request per (account day, placement). X allows up to seven days per
  synchronous request and answers each metric as an array aligned to the days
  (`data[].id_data[0].metrics.<metric>[i]`). A records evidence keys one item
  per entity, so one day per request is what keeps a row one (day, entity,
  placement) item; the cost is up to seven times the requests a seven-day read
  would make.
* `entity: "ACCOUNT"` (default) reads the account itself with
  `entity_ids={accountId}`. `entity: "CAMPAIGN"` reads the declared
  `campaignIds`, at most 20 (X's limit). Other entity types are not offered.
* `placements` defaults to `ALL_ON_TWITTER`. X accepts one placement per
  request and its UI totals sum `ALL_ON_TWITTER`, `SPOTLIGHT` and `TREND`, so
  each declared placement is one request of the same day.
* Rows are keyed by (day, entity id, placement) and carry `date`, `settled`,
  `entityId`, `entity`, `placement` and one column per metric.
* `metricGroups` chooses from `ENGAGEMENT`, `BILLING` and `VIDEO`, whose
  metrics X documents as arrays of integers. Every published metric is
  declared exact (an integer, so a value that arrives fractional fails the
  page); `billed_charge_local_micro` is spend in micro-units of the account
  currency. X documents only `engagements`, `impressions`, `retweets`,
  `replies`, `likes` and `follows` for the account entity, so the account
  entity offers `ENGAGEMENT` only and publishes those six. The conversion
  groups (`WEB_CONVERSION`, `MOBILE_CONVERSION`,
  `LIFE_TIME_VALUE_MOBILE_CONVERSION`) answer JSON objects per metric and are
  not offered. A metric X answers as `null` (no delivery) is published as
  `null`; metrics X adds beyond its documented tables are ignored.
* X's answer echoes `request.params`; a page whose echoed `start_time`,
  `end_time`, `granularity` or `placement` differs from the request is
  refused, as is an answer naming an entity that was not asked for, more than
  one series per entity, or `time_series_length` other than 1.

## Finality

X states nothing per row. Its documentation says metrics are locked after 24
hours except `billed_charge_local_micro`, which is an estimate for 3 days and
which billing may still change for up to 14 days (spam filtering, overspend
credits). `restatementDays` defaults to 14 when `BILLING` is read and 2
otherwise (24 hours plus a day for an account zone ahead of UTC). `settled` is
the window basis: true once the day was at least `restatementDays` old when
the pass read it. It is a recipe statement of X's documented window, not
provider evidence.

## Limits

* Synchronous analytics are rate limited to 250 requests per 15 minutes per
  user token. A `429` states `x-rate-limit-reset` (or
  `x-account-rate-limit-reset`) as epoch seconds and a `503` states
  `retry-after`; all three headers are retained and declared as the
  connection's backoff, honoured for up to 900 seconds.
* A pass makes (days read) x (placements) requests. With `BILLING` that is at
  least 15 days per placement on every pass, so `every` defaults to six hours.
* X advises its asynchronous jobs rather than the synchronous endpoint for
  onboarding backfills; a first pass from an old `start` reads one day per
  request regardless. The asynchronous jobs (gzip result files) are not built.

## Unverified

* Day bounds are rendered as each day's own midnight in `timeZone` with that
  day's UTC offset (`2026-10-05T00:00:00-07:00`), via `Intl`, as the Snapchat
  recipe does; whether the guest runtime carries the zone data is unverified.
  X's timezone page also says the offset to use is "the offset of the current
  day, not the offset of the day in question", which disagrees with its
  midnight-alignment rule for days across a daylight-saving change; which one
  X enforces is unverified. For zones with a half-hour offset, whether X's
  "whole hours" rule refers to the local or the UTC time is unverified.
* A day whose local midnight is still in the future (the UTC day a pass reads
  through, for a zone behind UTC) is requested like any other; X's answer to
  it is undocumented.
* `timezone_switch_at` (an account that moved from America/Los\_Angeles) is not
  modelled: days before the switch are read at the configured zone's
  midnights.

## Not built

Asynchronous analytics jobs, segmentation, line item, promoted post and
funding instrument entities, the Active Entities endpoint, conversion metric
groups and reach. Nothing here has run against X Ads or been qualified.

## Provider references

Provider references and prerequisites are maintained in the connector guidance above. No separate provider-documentation review date is recorded.

## Source and evidence

[Canonical connector source](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/src/connectors/x-ads/README.md), [native analysis](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/contract-analysis.json) and [check receipts](https://github.com/bijectionhq/component-support/blob/b632604330ce9cbcfe17a5a680ef4fbe80f6f672/packages/connectors/evidence.json).

Connector artifact: `905888ea276a2a28e36981a79e8142b2547ea451c3e63162cb6915ad4a7d1305`.

The resource declaration examples above are compiled and compared with exact catalog declarations. Recorded checks apply only to their source, declaration and runtime identities. Configure a connection and inspect its status to establish deployment-specific readiness.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.