Skip to main content
Glama

Save a checked claim to your Untap account

save_claim

Saves the result of a train, flight or TfL check to the person’s Untap account, so it appears on their dashboard with its deadline. Accepts the save_claim arguments returned by a check, with the price paid added where the check listed it as missing. The verdict is worked out again from those facts rather than copied. A train journey that is already saved is returned as it is, not saved twice. Requires sign-in to Untap.

Input Schema

NameRequiredDescriptionDefault
tflNoFor category "tfl": the journeys, in the shape a TfL check returns in save_claim.arguments.tfl.
trainNoFor category "train": the train booking, in the shape a train check returns in save_claim.arguments.train, with ticket_price_pence set.
flightNoFor category "flight": the flight, in the shape a flight check returns in save_claim.arguments.flight, with ticket_price_pence set.
categoryYesWhich kind of check the claim came from.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / tfl / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "card_last4": {
      -        "description": "Last 4 digits of the contactless card, if shown.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "journeys": {
      -        "description": "Every journey on the statement. Up to 500 per call.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "bus_route": {
      -              "description": "Bus route number for bus rows, otherwise null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "date": {
      -              "description": "Journey date as YYYY-MM-DD.",
      -              "type": "string"
      -            },
      -            "end_time": {
      -              "description": "Tap-out time as HH:MM, or null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "fare_pence": {
      -              "description": "Charge for this row in pence. £2.20 = 220.",
      -              "maximum": 100000,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "from_location": {
      -              "description": "Tap-in station / stop name, or null if not shown.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "intended_destination": {
      -              "anyOf": [
      -                {
      -                  "maxLength": 80,
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
      -            },
      -            "is_auto_corrected": {
      -              "description": "Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\").",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_daily_cap_hit": {
      -              "description": "Optional. True when the statement marks this row as the one where the daily cap was reached.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_hopper_free": {
      -              "description": "Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes).",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_incomplete": {
      -              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
      -              "type": "boolean"
      -            },
      -            "is_max_fare": {
      -              "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
      -              "type": "boolean"
      -            },
      -            "is_weekly_cap_hit": {
      -              "description": "Optional. True when the statement marks this row as the one where the weekly cap was reached.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "mode": {
      -              "description": "Transport mode for this row, or \"unknown\" when the statement does not say.",
      -              "enum": [
      -                "tube",
      -                "bus",
      -                "overground",
      -                "elizabeth",
      -                "dlr",
      -                "tram",
      -                "cable_car",
      -                "thameslink",
      -                "unknown"
      -              ],
      -              "type": "string"
      -            },
      -            "start_time": {
      -              "description": "Tap-in time as HH:MM, or null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "to_location": {
      -              "description": "Tap-out station / stop name, or null for incomplete journeys.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "start_time",
      -            "end_time",
      -            "mode",
      -            "from_location",
      -            "to_location",
      -            "bus_route",
      -            "fare_pence",
      -            "is_max_fare",
      -            "is_incomplete"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 500,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "period_end": {
      -        "description": "Statement period end date YYYY-MM-DD.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "period_start": {
      -        "description": "Statement period start date YYYY-MM-DD.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "card_last4",
      -      "period_start",
      -      "period_end",
      -      "journeys"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "card_last4": {
      +        "description": "Last 4 digits of the contactless card, if shown.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "journeys": {
      +        "description": "Every journey on the statement. Up to 500 per call.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "bus_route": {
      +              "description": "Bus route number for bus rows, otherwise null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "date": {
      +              "description": "Journey date as YYYY-MM-DD.",
      +              "type": "string"
      +            },
      +            "end_time": {
      +              "description": "Tap-out time as HH:MM, or null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "fare_pence": {
      +              "description": "Charge for this row in pence. £2.20 = 220.",
      +              "maximum": 100000,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "from_location": {
      +              "description": "Tap-in station / stop name, or null if not shown.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "intended_destination": {
      +              "anyOf": [
      +                {
      +                  "maxLength": 80,
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
      +            },
      +            "is_auto_corrected": {
      +              "description": "Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\").",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_daily_cap_hit": {
      +              "description": "Optional. True when the statement marks this row as the one where the daily cap was reached.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_hopper_free": {
      +              "description": "Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes).",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_incomplete": {
      +              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\"), including when it was charged the maximum fare for that reason.",
      +              "type": "boolean"
      +            },
      +            "is_inspection_penalty": {
      +              "description": "Optional. True only when the statement shows a penalty for failing a ticket inspection, which TfL does not refund. A maximum fare for a missing touch out counts as is_incomplete, not this.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_max_fare": {
      +              "description": "Deprecated. Replaced by is_incomplete and is_inspection_penalty.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_weekly_cap_hit": {
      +              "description": "Optional. True when the statement marks this row as the one where the weekly cap was reached.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "mode": {
      +              "description": "Transport mode for this row, or \"unknown\" when the statement does not say.",
      +              "enum": [
      +                "tube",
      +                "bus",
      +                "overground",
      +                "elizabeth",
      +                "dlr",
      +                "tram",
      +                "cable_car",
      +                "thameslink",
      +                "unknown"
      +              ],
      +              "type": "string"
      +            },
      +            "start_time": {
      +              "description": "Tap-in time as HH:MM, or null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "to_location": {
      +              "description": "Tap-out station / stop name, or null for incomplete journeys.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "start_time",
      +            "end_time",
      +            "mode",
      +            "from_location",
      +            "to_location",
      +            "bus_route",
      +            "fare_pence",
      +            "is_incomplete"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 500,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "period_end": {
      +        "description": "Statement period end date YYYY-MM-DD.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "period_start": {
      +        "description": "Statement period start date YYYY-MM-DD.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "card_last4",
      +      "period_start",
      +      "period_end",
      +      "journeys"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / train / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "booking_reference": {
      -        "description": "Booking reference if available, otherwise null.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "legs": {
      -        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "actual_arrival": {
      -              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "arrival_station": {
      -              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "delay_minutes": {
      -              "anyOf": [
      -                {
      -                  "maximum": 1440,
      -                  "minimum": 0,
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
      -            },
      -            "departure_station": {
      -              "description": "Full departure station name, e.g. \"London Kings Cross\".",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "operator_toc_code": {
      -              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
      -              "enum": [
      -                "VT",
      -                "CC",
      -                "CH",
      -                "EM",
      -                "GX",
      -                "GN",
      -                "GW",
      -                "LE",
      -                "NT",
      -                "SW",
      -                "SE",
      -                "SN",
      -                "TL",
      -                "TP",
      -                "AW",
      -                "LM",
      -                "LN",
      -                "XC",
      -                "GR",
      -                "SR",
      -                "LD",
      -                "HT",
      -                "CS"
      -              ],
      -              "type": "string"
      -            },
      -            "scheduled_arrival": {
      -              "description": "Scheduled arrival as ISO 8601 datetime.",
      -              "type": "string"
      -            },
      -            "scheduled_departure": {
      -              "description": "Scheduled departure as ISO 8601 datetime.",
      -              "type": "string"
      -            },
      -            "was_cancelled": {
      -              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "operator_toc_code",
      -            "departure_station",
      -            "arrival_station",
      -            "scheduled_departure",
      -            "scheduled_arrival"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "ticket_price_pence": {
      -        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
      -        "maximum": 1000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "ticket_type": {
      -        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare.",
      -        "enum": [
      -          "single",
      -          "return",
      -          "open_return",
      -          "advance",
      -          "anytime",
      -          "off_peak",
      -          "super_off_peak",
      -          "season",
      -          "other"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "ticket_price_pence",
      -      "ticket_type",
      -      "booking_reference",
      -      "legs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "booking_reference": {
      +        "description": "Booking reference if available, otherwise null.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "legs": {
      +        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "actual_arrival": {
      +              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "arrival_station": {
      +              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "delay_minutes": {
      +              "anyOf": [
      +                {
      +                  "maximum": 1440,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
      +            },
      +            "departure_station": {
      +              "description": "Full departure station name, e.g. \"London Kings Cross\".",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "operator_toc_code": {
      +              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
      +              "enum": [
      +                "VT",
      +                "CC",
      +                "CH",
      +                "EM",
      +                "GX",
      +                "GN",
      +                "GW",
      +                "LE",
      +                "NT",
      +                "SW",
      +                "SE",
      +                "SN",
      +                "TL",
      +                "TP",
      +                "AW",
      +                "LM",
      +                "LN",
      +                "XC",
      +                "GR",
      +                "SR",
      +                "LD",
      +                "HT",
      +                "CS"
      +              ],
      +              "type": "string"
      +            },
      +            "scheduled_arrival": {
      +              "description": "Scheduled arrival as ISO 8601 datetime.",
      +              "type": "string"
      +            },
      +            "scheduled_departure": {
      +              "description": "Scheduled departure as ISO 8601 datetime.",
      +              "type": "string"
      +            },
      +            "was_cancelled": {
      +              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "operator_toc_code",
      +            "departure_station",
      +            "arrival_station",
      +            "scheduled_departure",
      +            "scheduled_arrival"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "season_type": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "weekly",
      +              "monthly",
      +              "quarterly",
      +              "six_monthly",
      +              "annual",
      +              "flexi"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Season tickets only: how long the season runs. The operator divides the season price into single journeys (for example annual 464, monthly 40, weekly 10, flexi 16) and pays a share of one journey. When left out, the result gives the percentage and the method but no amount."
      +      },
      +      "ticket_price_pence": {
      +        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
      +        "maximum": 1000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "ticket_type": {
      +        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; for \"season\" the amount is a share of one journey value (see season_type); every other type uses the full price as the single fare.",
      +        "enum": [
      +          "single",
      +          "return",
      +          "open_return",
      +          "advance",
      +          "anytime",
      +          "off_peak",
      +          "super_off_peak",
      +          "season",
      +          "other"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ticket_price_pence",
      +      "ticket_type",
      +      "booking_reference",
      +      "legs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed6 schema fields changed
    • changedInput schema / properties / flight / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "actual_arrival": {
      -        "description": "OPTIONAL. Actual arrival as ISO 8601 datetime, if the user told you. Otherwise leave undefined.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "airline_iata": {
      -        "description": "Two-letter IATA airline code, e.g. \"BA\" for British Airways, \"U2\" for easyJet.",
      -        "maxLength": 2,
      -        "minLength": 2,
      -        "type": "string"
      -      },
      -      "arrival_iata": {
      -        "description": "Three-letter IATA arrival airport code, e.g. \"BCN\".",
      -        "maxLength": 3,
      -        "minLength": 3,
      -        "type": "string"
      -      },
      -      "booking_reference": {
      -        "description": "PNR / airline booking reference if available, otherwise null.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "delay_minutes": {
      -        "anyOf": [
      -          {
      -            "maximum": 2880,
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "OPTIONAL. Delay duration in minutes, if the user told you."
      -      },
      -      "departure_iata": {
      -        "description": "Three-letter IATA departure airport code, e.g. \"LHR\".",
      -        "maxLength": 3,
      -        "minLength": 3,
      -        "type": "string"
      -      },
      -      "flight_number": {
      -        "description": "Flight number including the airline prefix, e.g. \"BA2551\".",
      -        "type": "string"
      -      },
      -      "passenger_name": {
      -        "description": "Passenger name as printed on the ticket, or null if not visible.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "scheduled_arrival": {
      -        "description": "Scheduled arrival as ISO 8601 datetime.",
      -        "type": "string"
      -      },
      -      "scheduled_departure": {
      -        "description": "Scheduled departure as ISO 8601 datetime.",
      -        "type": "string"
      -      },
      -      "status": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "on_time",
      -              "delayed",
      -              "cancelled",
      -              "denied_boarding"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "OPTIONAL. Pass only if the user explicitly told you what happened. Otherwise leave undefined and Untap will look up the flight via AeroDataBox."
      -      },
      -      "ticket_price_pence": {
      -        "description": "Total fare paid in pence.",
      -        "maximum": 50000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "airline_iata",
      -      "flight_number",
      -      "departure_iata",
      -      "arrival_iata",
      -      "scheduled_departure",
      -      "scheduled_arrival",
      -      "ticket_price_pence",
      -      "booking_reference",
      -      "passenger_name"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "actual_arrival": {
      +        "description": "Optional. Actual arrival as an ISO 8601 datetime, if known.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "airline_iata": {
      +        "description": "Two-letter IATA airline code, e.g. \"BA\" for British Airways, \"U2\" for easyJet.",
      +        "maxLength": 2,
      +        "minLength": 2,
      +        "type": "string"
      +      },
      +      "arrival_iata": {
      +        "description": "Three-letter IATA arrival airport code, e.g. \"BCN\".",
      +        "maxLength": 3,
      +        "minLength": 3,
      +        "type": "string"
      +      },
      +      "booking_reference": {
      +        "description": "PNR / airline booking reference if available, otherwise null.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "delay_minutes": {
      +        "anyOf": [
      +          {
      +            "maximum": 2880,
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional. Arrival delay in minutes, if known."
      +      },
      +      "departure_iata": {
      +        "description": "Three-letter IATA departure airport code, e.g. \"LHR\".",
      +        "maxLength": 3,
      +        "minLength": 3,
      +        "type": "string"
      +      },
      +      "flight_number": {
      +        "description": "Flight number including the airline prefix, e.g. \"BA2551\".",
      +        "type": "string"
      +      },
      +      "passenger_name": {
      +        "description": "Passenger name as printed on the ticket, or null if not visible.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "scheduled_arrival": {
      +        "description": "Scheduled arrival as ISO 8601 datetime.",
      +        "type": "string"
      +      },
      +      "scheduled_departure": {
      +        "description": "Scheduled departure as ISO 8601 datetime.",
      +        "type": "string"
      +      },
      +      "status": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "on_time",
      +              "delayed",
      +              "cancelled",
      +              "denied_boarding"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Optional. What happened to the flight, if known. When left out, Untap looks the flight up in AeroDataBox flight-status records."
      +      },
      +      "ticket_price_pence": {
      +        "description": "Total fare paid in pence.",
      +        "maximum": 50000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "airline_iata",
      +      "flight_number",
      +      "departure_iata",
      +      "arrival_iata",
      +      "scheduled_departure",
      +      "scheduled_arrival",
      +      "ticket_price_pence",
      +      "booking_reference",
      +      "passenger_name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / flight / description
      Previous value: -"For category \"flight\": save_claim.arguments.flight from check_flight_compensation, with ticket_price_pence filled in."New value: +"For category \"flight\": the flight, in the shape a flight check returns in save_claim.arguments.flight, with ticket_price_pence set."
    • changedInput schema / properties / tfl / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "card_last4": {
      -        "description": "Last 4 digits of the contactless card, if shown.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "journeys": {
      -        "description": "Every journey on the statement. Up to 500 per call.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "bus_route": {
      -              "description": "Bus route number for bus rows, otherwise null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "date": {
      -              "description": "Journey date as YYYY-MM-DD.",
      -              "type": "string"
      -            },
      -            "end_time": {
      -              "description": "Tap-out time as HH:MM, or null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "fare_pence": {
      -              "description": "Charge for this row in pence. £2.20 = 220.",
      -              "maximum": 100000,
      -              "minimum": 0,
      -              "type": "integer"
      -            },
      -            "from_location": {
      -              "description": "Tap-in station / stop name, or null if not shown.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "is_auto_corrected": {
      -              "description": "OPTIONAL. True if the statement says TfL already auto-corrected this journey (e.g. \"Auto-completed\", \"Adjusted\").",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_daily_cap_hit": {
      -              "description": "OPTIONAL. True if the statement explicitly marks this row as the daily-cap-reached entry.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_hopper_free": {
      -              "description": "OPTIONAL. True if the statement marks this fare as a free Hopper fare (second bus/tram tap within 60 min).",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "is_incomplete": {
      -              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
      -              "type": "boolean"
      -            },
      -            "is_max_fare": {
      -              "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
      -              "type": "boolean"
      -            },
      -            "is_weekly_cap_hit": {
      -              "description": "OPTIONAL. True if the statement marks this row as a weekly-cap-reached entry.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            },
      -            "mode": {
      -              "description": "Transport mode for this row. Use \"unknown\" only if the statement does not say.",
      -              "enum": [
      -                "tube",
      -                "bus",
      -                "overground",
      -                "elizabeth",
      -                "dlr",
      -                "tram",
      -                "cable_car",
      -                "thameslink",
      -                "unknown"
      -              ],
      -              "type": "string"
      -            },
      -            "start_time": {
      -              "description": "Tap-in time as HH:MM, or null.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "to_location": {
      -              "description": "Tap-out station / stop name, or null for incomplete journeys.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "start_time",
      -            "end_time",
      -            "mode",
      -            "from_location",
      -            "to_location",
      -            "bus_route",
      -            "fare_pence",
      -            "is_max_fare",
      -            "is_incomplete"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 500,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "period_end": {
      -        "description": "Statement period end date YYYY-MM-DD.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "period_start": {
      -        "description": "Statement period start date YYYY-MM-DD.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "card_last4",
      -      "period_start",
      -      "period_end",
      -      "journeys"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "card_last4": {
      +        "description": "Last 4 digits of the contactless card, if shown.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "journeys": {
      +        "description": "Every journey on the statement. Up to 500 per call.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "bus_route": {
      +              "description": "Bus route number for bus rows, otherwise null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "date": {
      +              "description": "Journey date as YYYY-MM-DD.",
      +              "type": "string"
      +            },
      +            "end_time": {
      +              "description": "Tap-out time as HH:MM, or null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "fare_pence": {
      +              "description": "Charge for this row in pence. £2.20 = 220.",
      +              "maximum": 100000,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "from_location": {
      +              "description": "Tap-in station / stop name, or null if not shown.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "intended_destination": {
      +              "anyOf": [
      +                {
      +                  "maxLength": 80,
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Optional, for an incomplete journey with no touch out: the station the person was travelling to. With it, the refund is estimated as the fare charged minus the usual fare to that station. Without it, the figure is an upper limit equal to the whole charge."
      +            },
      +            "is_auto_corrected": {
      +              "description": "Optional. True when the statement says TfL has already corrected this journey (for example \"Auto-completed\" or \"Adjusted\").",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_daily_cap_hit": {
      +              "description": "Optional. True when the statement marks this row as the one where the daily cap was reached.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_hopper_free": {
      +              "description": "Optional. True when the statement shows this fare as a free Hopper fare (a second bus or tram within 60 minutes).",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "is_incomplete": {
      +              "description": "True if this journey has no tap-out recorded (e.g. label \"Incomplete\" or \"No exit\").",
      +              "type": "boolean"
      +            },
      +            "is_max_fare": {
      +              "description": "True if the statement labels this as a max-fare charge for a failed revenue inspection.",
      +              "type": "boolean"
      +            },
      +            "is_weekly_cap_hit": {
      +              "description": "Optional. True when the statement marks this row as the one where the weekly cap was reached.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            },
      +            "mode": {
      +              "description": "Transport mode for this row, or \"unknown\" when the statement does not say.",
      +              "enum": [
      +                "tube",
      +                "bus",
      +                "overground",
      +                "elizabeth",
      +                "dlr",
      +                "tram",
      +                "cable_car",
      +                "thameslink",
      +                "unknown"
      +              ],
      +              "type": "string"
      +            },
      +            "start_time": {
      +              "description": "Tap-in time as HH:MM, or null.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "to_location": {
      +              "description": "Tap-out station / stop name, or null for incomplete journeys.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "start_time",
      +            "end_time",
      +            "mode",
      +            "from_location",
      +            "to_location",
      +            "bus_route",
      +            "fare_pence",
      +            "is_max_fare",
      +            "is_incomplete"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 500,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "period_end": {
      +        "description": "Statement period end date YYYY-MM-DD.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "period_start": {
      +        "description": "Statement period start date YYYY-MM-DD.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "card_last4",
      +      "period_start",
      +      "period_end",
      +      "journeys"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / tfl / description
      Previous value: -"For category \"tfl\": save_claim.arguments.tfl from check_tfl_journeys."New value: +"For category \"tfl\": the journeys, in the shape a TfL check returns in save_claim.arguments.tfl."
    • changedInput schema / properties / train / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "booking_reference": {
      -        "description": "Booking reference if available, otherwise null.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "legs": {
      -        "description": "Every leg of this booking. Single ticket = 1 leg. Return = 2 legs (outbound first, then return). Multi-stop bookings can have more legs in journey order. Untap runs Delay Repay eligibility per leg and sums the entitlements.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "actual_arrival": {
      -              "description": "OPTIONAL. Per-leg actual arrival as ISO 8601 datetime if the user told you. Leave undefined to auto-check.",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "arrival_station": {
      -              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "delay_minutes": {
      -              "anyOf": [
      -                {
      -                  "maximum": 1440,
      -                  "minimum": 0,
      -                  "type": "integer"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "description": "OPTIONAL. Per-leg delay in minutes if the user told you. Leave undefined to auto-check via HSP."
      -            },
      -            "departure_station": {
      -              "description": "Full departure station name, e.g. \"London Kings Cross\".",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "operator_toc_code": {
      -              "description": "TOC code for this leg. Must match one of the National Rail two-letter codes: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
      -              "enum": [
      -                "VT",
      -                "CC",
      -                "CH",
      -                "EM",
      -                "GX",
      -                "GN",
      -                "GW",
      -                "LE",
      -                "NT",
      -                "SW",
      -                "SE",
      -                "SN",
      -                "TL",
      -                "TP",
      -                "AW",
      -                "LM",
      -                "LN",
      -                "XC",
      -                "GR",
      -                "SR",
      -                "LD",
      -                "HT",
      -                "CS"
      -              ],
      -              "type": "string"
      -            },
      -            "scheduled_arrival": {
      -              "description": "Scheduled arrival as ISO 8601 datetime.",
      -              "type": "string"
      -            },
      -            "scheduled_departure": {
      -              "description": "Scheduled departure as ISO 8601 datetime.",
      -              "type": "string"
      -            },
      -            "was_cancelled": {
      -              "description": "OPTIONAL. True if the user said this leg was cancelled. Skips the HSP lookup.",
      -              "type": [
      -                "boolean",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "operator_toc_code",
      -            "departure_station",
      -            "arrival_station",
      -            "scheduled_departure",
      -            "scheduled_arrival"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "ticket_price_pence": {
      -        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
      -        "maximum": 1000000,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "ticket_type": {
      -        "description": "Ticket type as printed. \"return\" or \"open_return\" trigger half-fare-per-leg compensation; everything else uses the full ticket as the single-fare basis.",
      -        "enum": [
      -          "single",
      -          "return",
      -          "open_return",
      -          "advance",
      -          "anytime",
      -          "off_peak",
      -          "super_off_peak",
      -          "season",
      -          "other"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "ticket_price_pence",
      -      "ticket_type",
      -      "booking_reference",
      -      "legs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "booking_reference": {
      +        "description": "Booking reference if available, otherwise null.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "legs": {
      +        "description": "Each journey on this booking, in travel order: one for a single, two for a return (outward first), more for a multi-stop booking. Untap works out Delay Repay for each journey and adds them up.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "actual_arrival": {
      +              "description": "Optional. Actual arrival for this journey as an ISO 8601 datetime, if known. When left out, Untap looks it up.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "arrival_station": {
      +              "description": "Full arrival station name, e.g. \"Edinburgh Waverley\".",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "delay_minutes": {
      +              "anyOf": [
      +                {
      +                  "maximum": 1440,
      +                  "minimum": 0,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "Optional. Delay at arrival for this journey, in minutes, if known. When left out, Untap looks it up in National Rail records."
      +            },
      +            "departure_station": {
      +              "description": "Full departure station name, e.g. \"London Kings Cross\".",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "operator_toc_code": {
      +              "description": "National Rail two-letter operator code for this journey: VT=Avanti West Coast, CC=c2c, CH=Chiltern Railways, EM=East Midlands Railway, GX=Gatwick Express, GN=Great Northern, GW=Great Western Railway, LE=Greater Anglia, NT=Northern Trains, SW=South Western Railway, SE=Southeastern, SN=Southern, TL=Thameslink, TP=TransPennine Express, AW=Transport for Wales, LM=West Midlands Railway, LN=London Northwestern Railway, XC=CrossCountry, GR=LNER, SR=ScotRail, LD=Lumo, HT=Hull Trains, CS=Caledonian Sleeper",
      +              "enum": [
      +                "VT",
      +                "CC",
      +                "CH",
      +                "EM",
      +                "GX",
      +                "GN",
      +                "GW",
      +                "LE",
      +                "NT",
      +                "SW",
      +                "SE",
      +                "SN",
      +                "TL",
      +                "TP",
      +                "AW",
      +                "LM",
      +                "LN",
      +                "XC",
      +                "GR",
      +                "SR",
      +                "LD",
      +                "HT",
      +                "CS"
      +              ],
      +              "type": "string"
      +            },
      +            "scheduled_arrival": {
      +              "description": "Scheduled arrival as ISO 8601 datetime.",
      +              "type": "string"
      +            },
      +            "scheduled_departure": {
      +              "description": "Scheduled departure as ISO 8601 datetime.",
      +              "type": "string"
      +            },
      +            "was_cancelled": {
      +              "description": "Optional. True when this journey was cancelled. When set, no National Rail lookup is made.",
      +              "type": [
      +                "boolean",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "operator_toc_code",
      +            "departure_station",
      +            "arrival_station",
      +            "scheduled_departure",
      +            "scheduled_arrival"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "ticket_price_pence": {
      +        "description": "Total fare paid in pence for the whole booking. £62.00 = 6200.",
      +        "maximum": 1000000,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "ticket_type": {
      +        "description": "Ticket type as printed. For \"return\" and \"open_return\" the single fare is half the price paid; every other type uses the full price as the single fare.",
      +        "enum": [
      +          "single",
      +          "return",
      +          "open_return",
      +          "advance",
      +          "anytime",
      +          "off_peak",
      +          "super_off_peak",
      +          "season",
      +          "other"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ticket_price_pence",
      +      "ticket_type",
      +      "booking_reference",
      +      "legs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / train / description
      Previous value: -"For category \"train\": save_claim.arguments.train from check_train_delay, with ticket_price_pence filled in."New value: +"For category \"train\": the train booking, in the shape a train check returns in save_claim.arguments.train, with ticket_price_pence set."
  4. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write/non-destructive/non-idempotent, and the description adds real context: sign-in required, price must be supplied where the check omitted it, the verdict is recomputed rather than copied, and an already-saved train journey is returned unchanged instead of duplicated. The last point is a useful nuance the annotations don't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and target, then workflow, then behavior, then auth requirement. Five sentences all carry information; 'Requires sign-in to Untap' could be hoisted earlier but is not waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries return-shape burden, and it partly does so by stating the claim appears on the dashboard with a deadline and that the verdict is recomputed. It does not say what the call actually returns (claim id, amount, deadline) when responding, which is the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: the arguments are the exact objects returned by a check, and ticket_price_pence must be filled in where the check reported it missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Saves the result of a train, flight or TfL check ... to the person's Untap account') and names the outcome (dashboard entry with deadline). It is clearly distinguishable from the check_* siblings that produce the data it consumes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly ties usage to a prior check: it 'Accepts the save_claim arguments returned by a check,' which tells the agent this is the post-check persistence step. It does not name the add_* siblings as the alternative for manual entry, nor state when-not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.