Skip to content

Rate Manager feeds

Ask Keelvar support to enable Rate Manager API Feed for your organisation.
Then your organisation's rate-card data is available through the Rate Manager feeds:

  • Rates (/feeds/rate-manager/rates) — one record per rate, with each value named by the card field it belongs to.
  • Rate cards (/feeds/rate-manager/rate-cards) — your organisation's rate cards, each with its field definitions.

See the OpenAPI specification for full details.

Rates carry their values as named entries: each one has the column_name of the card field it belongs to, so you can read a price without first fetching the card's design and joining to it. Values appear in the card's field order. A currency or unit column is inlined onto the value it qualifies, and keeps its own entry as well.

The field definitions (fields) are available on the rate cards feed and on the rate_cards include, for the card's full design — data types, precision, roles, and the columns no record happens to carry a value for.

Note

Names are resolved when you read, not when the record was stored, and a card's field definitions are replaced wholesale whenever its design changes. So renaming a column changes the column_name on rates you have already pulled, without advancing their modified timestamp. Watch the modified timestamp on the rate_cards include to know when a card's design last changed.

A value whose field the card no longer defines is omitted. A rate that reaches the warehouse ahead of its card therefore serialises with an empty values — treat that as transient rather than as a record with no data.

Note

Feeds are scoped to your organisation. An organisation API token sees all rate cards in the organisation, including any restricted to particular users in the Rate Manager UI.

Rates feed

Records are rates. Values are strings, named by the card field each belongs to.

Basic rates feed

This example is unfiltered, so returns all rate records in the order they were added or modified, oldest first.

Request

GET /api/feeds/rate-manager/rates
Response
{
    "data": [
        {
            "id": "1a1a0000-0000-0000-0000-000000000001",
            "rate_card": "aaaa0000-0000-0000-0000-000000000000",
            "identifier": "R-0042",
            "supplier": "dddd0000-0000-0000-0000-000000000001",
            "archived": false,
            "values": [
                {
                    "column_name": "Price",
                    "value": "1200",
                    "currency": "EUR"
                },
                {
                    "column_name": "Lane",
                    "value": "DUB-CDG"
                },
                {
                    "column_name": "Currency",
                    "value": "EUR"
                }
            ],
            "modified": "2026-07-01T10:00:00.000000Z"
        },
        {
            "id": "1a1a0000-0000-0000-0000-000000000002",
            "rate_card": "aaaa0000-0000-0000-0000-000000000000",
            "identifier": "R-0043",
            "supplier": "dddd0000-0000-0000-0000-000000000001",
            "archived": false,
            "values": [
                {
                    "column_name": "Price",
                    "value": "1350",
                    "currency": "EUR"
                },
                {
                    "column_name": "Lane",
                    "value": "DUB-AMS"
                },
                {
                    "column_name": "Currency",
                    "value": "EUR"
                }
            ],
            "modified": "2026-07-01T10:00:00.000000Z"
        }
    ]
}

With includes

Request the rate_cards include to receive the rate cards referenced by the page's rates, with their field definitions.

Request

GET /api/feeds/rate-manager/rates?include=rate_cards
Response
{
    "data": [
        {
            "id": "1a1a0000-0000-0000-0000-000000000001",
            "rate_card": "aaaa0000-0000-0000-0000-000000000000",
            "identifier": "R-0042",
            "supplier": "dddd0000-0000-0000-0000-000000000001",
            "archived": false,
            "values": [
                {
                    "column_name": "Price",
                    "value": "1200",
                    "currency": "EUR"
                },
                {
                    "column_name": "Lane",
                    "value": "DUB-CDG"
                },
                {
                    "column_name": "Currency",
                    "value": "EUR"
                }
            ],
            "modified": "2026-07-01T10:00:00.000000Z"
        }
    ],
    "includes": {
        "rate_cards": [
            {
                "id": "aaaa0000-0000-0000-0000-000000000000",
                "name": "EU Road Freight 2026",
                "category": "Logistics",
                "archived": false,
                "fields": [
                    {
                        "column_name": "Price",
                        "data_type": "CURRENCY",
                        "scope": "RATE",
                        "position": 1,
                        "options": [],
                        "currency_column": "Currency"
                    },
                    {
                        "column_name": "Lane",
                        "data_type": "TEXT",
                        "scope": "ITEM",
                        "position": 2,
                        "options": []
                    },
                    {
                        "column_name": "Currency",
                        "data_type": "TEXT",
                        "scope": "RATE",
                        "position": 3,
                        "options": []
                    }
                ],
                "modified": "2026-06-20T09:00:00.000000Z"
            }
        ]
    }
}

Filters

The rates feed supports rate_card, supplier, sourcing_event, archived, and the modified_after / modified_before date range. Filters are applied additively.

GET /api/feeds/rate-manager/rates?rate_card=aaaa0000-0000-0000-0000-000000000000&archived=false

If no date filters are provided, the feed returns the last 45 days of data by default.

Rate cards feed

Lists your organisation's rate cards, each with its fields definitions, oldest-modified first, with the same modified_after / modified_before and 45-day default window conventions as the other feeds. Supports category and archived filters.

Request

GET /api/feeds/rate-manager/rate-cards
Response
{
    "data": [
        {
            "id": "aaaa0000-0000-0000-0000-000000000000",
            "name": "EU Road Freight 2026",
            "description": "Road freight lanes for the EU network",
            "category": "Logistics",
            "archived": false,
            "fields": [
                {
                    "column_name": "Price",
                    "data_type": "CURRENCY",
                    "scope": "RATE",
                    "position": 1,
                    "options": [],
                    "currency_column": "Currency"
                },
                {
                    "column_name": "Lane",
                    "data_type": "TEXT",
                    "scope": "ITEM",
                    "position": 2,
                    "options": []
                },
                {
                    "column_name": "Currency",
                    "data_type": "TEXT",
                    "scope": "RATE",
                    "position": 3,
                    "options": []
                }
            ],
            "modified": "2026-06-20T09:00:00.000000Z"
        },
        {
            "id": "bbbb0000-0000-0000-0000-000000000000",
            "name": "Ocean FCL 2026",
            "category": "Logistics",
            "archived": false,
            "fields": [
                {
                    "column_name": "Container Type",
                    "data_type": "TEXT",
                    "scope": "ITEM",
                    "position": 1,
                    "options": [
                        "20FT",
                        "40FT"
                    ]
                }
            ],
            "modified": "2026-07-01T10:00:00.000000Z"
        }
    ]
}

The fields entries are the columns the card's rates carry values for, and their position is the order those values appear in.

Note

Like the other feeds, this one applies the 45-day default window. A card that has not changed recently is only returned if you widen it with modified_after.

Data updates

Like the other Export API feeds, modified records are re-appended to the end of the feed rather than updated in place, so cursor-based consumers observe every change. Deleting a rate or card is a soft delete: the record re-appears with archived: true.

Typical consumer workflow

  1. Poll the feeds periodically.
  2. Pull the changes: GET /api/feeds/rate-manager/rates?rate_card={card}&modified_after={last_sync}
  3. Refresh the card's field definitions from the rate_cards include when its modified timestamp has advanced — a design change can rename or drop a column on rates you have already pulled.