---
title: "Check ABF feed freshness"
url: "https://console.9fin.com/apis/abf-service/versions/a79a8be2-dd41-4541-904d-592dc9ccf46e/operations/get_abf_feed_summary_v0_abf_feed_summary_get"
---

> Full API specification: https://console.9fin.com/apis/abf-service/versions/a79a8be2-dd41-4541-904d-592dc9ccf46e.md

# Check ABF feed freshness

`GET` `/v0/abf/feed-summary`

Operation ID: `get_abf_feed_summary_v0_abf_feed_summary_get`

Check whether anything changed before pulling a full listing. Cheap enough to poll frequently. Compare `deals.latest_updated_at` against your previous pull: if it has not moved, nothing changed and you can skip the pull. Supply `since` to also get the number of deals that changed, and `until` to bound that window.

## Query parameters

- `since` (optional) - Only include results changed at or after this timestamp. A value with no offset is read as UTC. The bound is inclusive, so passing a watermark back re-includes the result it came from.
- `until` (optional) - Upper bound for the `since` window, inclusive. Ignored unless `since` is also supplied, and must not be earlier than it.

## Responses

- `200` - Successful Response
- `400` - Malformed filter, sort or cursor parameter, or an inverted `since`/`until` window.
- `403` - Forbidden (the request did not arrive via the API gateway).
- `422` - Validation Error
- `500` - Unexpected server error.
- `503` - Service unavailable (e.g. database down).

## OpenAPI definition

```yaml
openapi: 3.1.0
info:
  title: 9fin ABF API
  version: 0.1.6
servers:
  - description: Production environment
    url: https://api.9fin.com
paths:
  /v0/abf/feed-summary:
    get:
      description: >-
        Check whether anything changed before pulling a full listing.


        Cheap enough to poll frequently. Compare `deals.latest_updated_at`
        against

        your previous pull: if it has not moved, nothing changed and you can
        skip

        the pull. Supply `since` to also get the number of deals that changed,
        and

        `until` to bound that window.
      operationId: get_abf_feed_summary_v0_abf_feed_summary_get
      parameters:
        - description: Only include results changed at or after this timestamp. A value
            with no offset is read as UTC. The bound is inclusive, so passing a
            watermark back re-includes the result it came from.
          in: query
          name: since
          required: false
          schema:
            anyOf:
              - format: date-time
                type: string
              - type: "null"
            default: null
            description: Only include results changed at or after this timestamp. A value
              with no offset is read as UTC. The bound is inclusive, so passing
              a watermark back re-includes the result it came from.
            examples:
              - 2026-08-21T09:14:02Z
            title: Since
        - description: Upper bound for the `since` window, inclusive. Ignored unless
            `since` is also supplied, and must not be earlier than it.
          in: query
          name: until
          required: false
          schema:
            anyOf:
              - format: date-time
                type: string
              - type: "null"
            default: null
            description: Upper bound for the `since` window, inclusive. Ignored unless
              `since` is also supplied, and must not be earlier than it.
            title: Until
      responses:
        "200":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FeedSummary"
          description: Successful Response
        "400":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
          description: Malformed filter, sort or cursor parameter, or an inverted
            `since`/`until` window.
        "403":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
          description: Forbidden (the request did not arrive via the API gateway).
        "422":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HTTPValidationError"
          description: Validation Error
        "500":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InternalServerErrorResponse"
          description: Unexpected server error.
        "503":
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ErrorResponse"
          description: Service unavailable (e.g. database down).
      security:
        - HTTPBearer: []
      summary: Check ABF feed freshness
      tags:
        - Feed
security:
  - HTTPBearer: []
components:
  schemas:
    FeedSummary:
      description: >-
        Freshness of the ABF feed, for deciding whether to pull.


        Poll this before requesting a full listing: if `latest_updated_at` has
        not

        moved since your last pull, nothing changed and you can skip it. It is
        also

        how you tell a quiet market from a stalled feed — a `latest_updated_at`
        that

        stops advancing for longer than 9fin's usual publishing rhythm means the

        data is stale, not that nothing priced.
      examples:
        - changed_since:
            deals: 3
          deals:
            latest_updated_at: 2026-08-21T09:14:02.117Z
      properties:
        changed_since:
          anyOf:
            - $ref: "#/components/schemas/ChangedSince"
            - type: "null"
          description: Counts of rows changed in the window you asked for — at or after
            `since`, and at or before `until` when given. Null when `since` is
            omitted.
        deals:
          $ref: "#/components/schemas/ResourceSummary"
          description: Freshness of `/v0/abf/deals`.
      required:
        - deals
        - changed_since
      title: FeedSummary
      type: object
    ErrorResponse:
      description: Standard error body returned when a request cannot be served.
      examples:
        - error_code: forbidden
          message: The request did not arrive via the API gateway.
          trace_id: 202bde256c7d446f9623efdc96286c5d
        - error_code: service_unavailable
          message: Database is not available
          trace_id: c2416d52c6d14c8e831aad792407442c
      properties:
        error_code:
          title: Error Code
          type: string
        message:
          title: Message
          type: string
        trace_id:
          anyOf:
            - type: string
            - type: "null"
          title: Trace Id
      required:
        - error_code
        - message
      title: ErrorResponse
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: "#/components/schemas/ValidationError"
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    InternalServerErrorResponse:
      properties:
        error_code:
          examples:
            - internal_server_error
          title: Error Code
          type: string
        message:
          examples:
            - An unexpected error occurred.
          title: Message
          type: string
        trace_id:
          anyOf:
            - type: string
            - type: "null"
          examples:
            - e7dfd20231374d308f04655eb0538be4
          title: Trace Id
      required:
        - error_code
        - message
        - trace_id
      title: InternalServerErrorResponse
      type: object
    ChangedSince:
      description: How much changed since the watermark you supplied.
      properties:
        deals:
          description: Deals whose `updated_at` falls in the requested window.
          title: Deals
          type: integer
      required:
        - deals
      title: ChangedSince
      type: object
    ResourceSummary:
      description: When a resource last changed.
      properties:
        latest_updated_at:
          anyOf:
            - format: date-time
              type: string
            - type: "null"
          description: >-
            Most recent `updated_at` across every row of this resource (UTC).
            Held behind real time by a small buffer, so store it and send it
            back as `since` on your next call.


            Null when there is nothing to report yet. Keep the watermark you
            already hold and retry — do not pass `null` as `since`.
          title: Latest Updated At
      required:
        - latest_updated_at
      title: ResourceSummary
      type: object
    ValidationError:
      properties:
        ctx:
          title: Context
          type: object
        input:
          title: Input
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
  securitySchemes:
    HTTPBearer:
      bearerFormat: JWT
      scheme: bearer
      type: http
```
