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

# List tables changed since a given timestamp

> Returns metadata for all tables whose last successful sync occurred after `since`. Only tables with `status = 'synced'` and a non-null `last_sync_at` are returned. Each entry includes an `endpoint_url` pointing to the corresponding category endpoint (e.g. `/realestates/objects`) or `/raw/{table_name}` for tables without a category mapping.

**ETag / conditional GET:** The response includes an `ETag` header based on the latest sync timestamp.  Send the value back as `If-None-Match` on subsequent requests — when the sync state has not changed the server returns `304 Not Modified` without a body and without querying the change data.

**Use case:** Poll this endpoint periodically to discover which tables have new data before fetching only the changed ones — avoids fetching unchanged tables on every sync.



## OpenAPI

````yaml https://api.trassets.ai/openapi.json get /changes
openapi: 3.1.0
info:
  title: Trassets Data API
  description: >

    The **Trassets Data API** exposes customer real-estate and market data as a
    REST API —

    objects, units, contracts, meters and bookings, machine-readable and stably
    versioned under `/v1/`.


    ## Quickstart


    ```bash

    export TRASSETS_API_KEY="sk_live_…"

    curl "https://api.trassets.ai/v1/realestates/objects?limit=1" \
      -H "X-API-Key: $TRASSETS_API_KEY"
    ```


    ## Authentication


    Send your API key on every request as the `X-API-Key` header.

    The key determines the customer scope and access tiers.

    Trassets stores only an HMAC-SHA-256 hash — the plaintext key is never shown
    again after creation.


    ## Endpoint Types


    ### Category Endpoints — `/{category}/{api_table}`


    Normalized master data and business queries. Use these for day-to-day
    integrations.


    - **Pagination:** Offset-based (`limit` / `offset` query parameters)

    - **Data character:** Normalized, business-ready data

    - **Use case:** Business queries, dashboards, incremental data fetches


    ### Raw Endpoints — `/raw/{table_name}`


    Full table access for bulk sync and export.


    - **Pagination:** Cursor-based (`cursor` query parameter from `next_cursor`
    in response)

    - **Data character:** Raw source data, unfiltered

    - **Use case:** Bulk sync, full exports, data warehousing


    ## Pagination


    - **Category endpoints**: `X-Total-Count`, `X-Has-More`, `X-Next-Offset`
    response headers.

    - **Raw endpoints**: `next_cursor` in response body. Stable under concurrent
    writes.


    ## Error format


    Errors follow [RFC 7807](https://datatracker.ietf.org/doc/html/rfc7807)
    (`application/problem+json`):

    `type`, `title`, `status`, `detail`, `instance`.


    | Status | Meaning |

    |--------|---------|

    | 400 | Missing required filter |

    | 401 | Invalid API key |

    | 403 | Missing access tier |

    | 404 | Unknown endpoint |

    | 429 | Rate limit (500 req/h per API key; see `Retry-After` header) |

    | 500 | Internal error |


    ## Versioning Policy


    This API will adopt URL versioning (`/v1/`) in an upcoming release. Breaking
    changes will then be

    introduced under a new version prefix. Until versioning is in place, the API
    may receive breaking changes.


    ## Field Glossary


    The following fields appear across multiple endpoints:


    | Field | Description |

    |---|---|

    | `entrance` | Street name and house number, e.g. Musterstrasse 12 |

    | `address` | Comma-separated postal code and city, e.g. 10115, Berlin |

    | `name` | Full name as single field. No separate first/last name available.
    |

    | `floor_area_id` | References floor_area_id in the property_structure table
    |


    ## Request an API key


    API keys are issued via the [Trassets
    Portal](https://portal.api.trassets.ai).
  version: 1.0.0
servers: []
security: []
paths:
  /changes:
    get:
      tags:
        - Delta Sync
      summary: List tables changed since a given timestamp
      description: >-
        Returns metadata for all tables whose last successful sync occurred
        after `since`. Only tables with `status = 'synced'` and a non-null
        `last_sync_at` are returned. Each entry includes an `endpoint_url`
        pointing to the corresponding category endpoint (e.g.
        `/realestates/objects`) or `/raw/{table_name}` for tables without a
        category mapping.


        **ETag / conditional GET:** The response includes an `ETag` header based
        on the latest sync timestamp.  Send the value back as `If-None-Match` on
        subsequent requests — when the sync state has not changed the server
        returns `304 Not Modified` without a body and without querying the
        change data.


        **Use case:** Poll this endpoint periodically to discover which tables
        have new data before fetching only the changed ones — avoids fetching
        unchanged tables on every sync.
      operationId: get_changes_changes_get
      parameters:
        - name: since
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              ISO-8601 UTC timestamp. Only tables synced **after** this point
              are returned. Required. Must not be older than 30 days. Example:
              `2026-07-01T00:00:00Z`
            title: Since
          description: >-
            ISO-8601 UTC timestamp. Only tables synced **after** this point are
            returned. Required. Must not be older than 30 days. Example:
            `2026-07-01T00:00:00Z`
        - name: category
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Optional category filter. When provided, only tables belonging to
              this category are returned. Unknown values result in HTTP 400 with
              a list of valid categories.
            title: Category
          description: >-
            Optional category filter. When provided, only tables belonging to
            this category are returned. Unknown values result in HTTP 400 with a
            list of valid categories.
      responses:
        '200':
          description: List of changed tables (may be empty if nothing has changed)
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ChangedTable'
                title: Response Get Changes Changes Get
              examples:
                with_changes:
                  summary: Two tables changed since the given timestamp
                  value:
                    - table_name: properties
                      last_sync_at: '2026-07-07T06:00:00'
                      category: realestates
                      api_table_name: objects
                      endpoint_url: /realestates/objects
                    - table_name: ixhaus_contracts
                      last_sync_at: '2026-07-07T06:05:00'
                      endpoint_url: /raw/ixhaus_contracts
                no_changes:
                  summary: Nothing changed since the given timestamp
                  value: []
        '304':
          description: Not Modified — sync state unchanged since the ETag was issued
        '400':
          description: Bad Request
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Bad Request
                status: 400
                detail: since parameter must be a valid ISO 8601 datetime
                instance: /changes
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Unauthorized
                status: 401
                detail: API key required
                instance: /changes
        '403':
          description: Forbidden
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Forbidden
                status: 403
                detail: Invalid or disabled API key
                instance: /changes
        '404':
          description: Not Found
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Not Found
                status: 404
                detail: Table or schema not found
                instance: /changes
        '422':
          description: Unprocessable Entity
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Unprocessable Entity
                status: 422
                detail: 'query -> since: value is not a valid datetime'
                instance: /changes
        '429':
          description: Too Many Requests
          content:
            application/problem+json:
              example:
                type: about:blank
                title: Too Many Requests
                status: 429
                detail: 'Rate limit exceeded: 500 per 1 hour'
                instance: /changes
      security:
        - APIKeyHeader: []
components:
  schemas:
    ChangedTable:
      properties:
        table_name:
          type: string
          title: Table Name
          description: Internal database table name (snake_case iXHaus export name).
        last_sync_at:
          type: string
          format: date-time
          title: Last Sync At
          description: UTC timestamp of the last successful sync for this table.
        category:
          anyOf:
            - type: string
            - type: 'null'
          title: Category
          description: >-
            API category slug (e.g. `realestates`). `null` for tables that have
            no category mapping and are only accessible via `/raw/`.
        api_table_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Api Table Name
          description: >-
            Table name as used in the category endpoint URL (e.g. `objects`).
            `null` when `category` is `null`.
        endpoint_url:
          type: string
          title: Endpoint Url
          description: >-
            Relative URL to fetch data for this table, e.g.
            `/realestates/objects` or `/raw/ixhaus__ixexpobj`.
      type: object
      required:
        - table_name
        - last_sync_at
        - category
        - api_table_name
        - endpoint_url
      title: ChangedTable
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key

````