# fx-threshold

ECB foreign-exchange rate from Frankfurter, emitted when it is at or above a threshold.

Category: Price and market. Allow `api.frankfurter.app, api.frankfurter.dev`.

Updated 2026-10-17. HTML: https://asipipes.com/pipes-library/fx-threshold

## CLI

```
pipes run examples/fx-threshold.pipe.yaml
```

## MCP call

```json
{
  "name": "pipe__fx-threshold",
  "arguments": {}
}
```

## Pipe file

`examples/fx-threshold.pipe.yaml`

```yaml
pipes: 0
name: fx-threshold
version: 0.1.0
description: ECB foreign-exchange rate from Frankfurter, emitted when it is at or above a threshold.
permissions:
  network: [api.frankfurter.app, api.frankfurter.dev]
inputs:
  type: object
  properties:
    base:
      type: string
      pattern: "^[A-Z]{3}$"
      default: USD
    quote:
      type: string
      pattern: "^[A-Z]{3}$"
      default: EUR
    at_least:
      type: number
      minimum: 0
      default: 0
  required: [base, quote]
outputs:
  type: object
  properties:
    text: { type: string }
    count: { type: integer }
  required: [text, count]
output:
  text: "${steps.format.text}"
  count: "${steps.format.count}"
steps:
  - id: fetch
    block: fetch_http
    with:
      url: https://api.frankfurter.app/latest
      query:
        from: "${inputs.base}"
        to: "${inputs.quote}"
      max_bytes: 100000
    retry: { max: 2, backoff_ms: 500 }
    timeout_ms: 15000
  - id: rates
    block: parse_json
    in: "${steps.fetch}"
    with:
      path: rates
      entries: true
  - id: shaped
    block: map
    in: "${steps.rates}"
    with:
      set:
        pair: "${inputs.base}/${item.key}"
        rate: "${item.value}"
      number: [rate]
      pick: [pair, rate]
  - id: hot
    block: filter
    in: "${steps.shaped}"
    with:
      where: { field: rate, op: gte, value: "${inputs.at_least}" }
  - id: format
    block: format
    in: "${steps.hot}"
    with:
      header: "FX:\n"
      item_template: "- ${item.pair} ${item.rate}"
      separator: "\n"
  - id: print
    block: emit_stdout
    in: "${steps.format.text}"
    with: { format: text }
```
