FX Reference Data · x402 V1 + V2

Daily ECB FX Reference Rate History

Use this service when you need this capability: returns up to 256 daily ECB EUR reference-rate observations across a bounded date range, not real-time quotes. ECB source data is free; the price covers SignalHarness normalization and delivery. Every result includes source attribution and freshness warnings.

Price and endpoint

LivePOSTBase USDC

0.01 USDC per call

x402 V1 + V2 exact payment on Base mainnet (base in V1; eip155:8453 in V2) using USDC. One HTTP 402 response carries the canonical V2 PAYMENT-REQUIRED header and equivalent V1 JSON body.

POST https://signalharness.ai/api/agent/services/fx_rate_history/invoke

Purpose

Returns up to 256 daily ECB EUR reference-rate observations across a bounded date range, not real-time quotes. ECB source data is free; the price covers SignalHarness normalization and delivery. Every result includes source attribution and freshness warnings.

Daily ECB reference data, not real-time quotes. ECB source data is free; the service price covers normalization and delivery. Check the observation date, attribution, and freshness warnings in each result.

Inputs

Request fields and validation limits
FieldTypeRequiredLimits
basestringRequiredAllowed: EUR; Minimum length 3; Maximum length 3
quotestringRequiredPattern: ^[A-Z]{3}$; Minimum length 3; Maximum length 3
startDatestringRequiredPattern: ^\d{4}-\d{2}-\d{2}$; Minimum length 10; Maximum length 10
endDatestringRequiredPattern: ^\d{4}-\d{2}-\d{2}$; Minimum length 10; Maximum length 10
limitintegerOptionalMinimum 1; Maximum 256

Example request body

{
  "base": "EUR",
  "quote": "USD",
  "startDate": "2026-09-01",
  "endDate": "2026-09-08",
  "limit": 8
}
View complete input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "minProperties": 4,
  "maxProperties": 5,
  "required": [
    "base",
    "quote",
    "startDate",
    "endDate"
  ],
  "properties": {
    "base": {
      "type": "string",
      "enum": [
        "EUR"
      ],
      "minLength": 3,
      "maxLength": 3
    },
    "quote": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "minLength": 3,
      "maxLength": 3
    },
    "startDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "minLength": 10,
      "maxLength": 10
    },
    "endDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "minLength": 10,
      "maxLength": 10
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 256
    }
  }
}

Realistic output shape

Illustrative output from the canonical adapter fixture and schema. It is not a completed paid execution or a current live observation.

{
  "base": "USD",
  "quote": "USD",
  "symbol": "EUR/USD",
  "startDate": "2026-09-12",
  "endDate": "2026-09-12",
  "count": 0,
  "points": [
    {
      "date": "2026-09-12",
      "rate": 1e-8,
      "status": "succeeded"
    }
  ],
  "retrievedAt": "example0000000000000",
  "source": {
    "provider": "example",
    "dataset": "example",
    "sourceUrl": "https://example.com/resource",
    "freeAccessUrl": "https://example.com/resource",
    "retrievedAt": "example0000000000000",
    "attribution": "example",
    "notice": "example"
  },
  "warnings": [
    "Verify the caller-supplied data before relying on this result."
  ]
}
View complete output schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "minProperties": 10,
  "maxProperties": 10,
  "required": [
    "base",
    "quote",
    "symbol",
    "startDate",
    "endDate",
    "count",
    "points",
    "retrievedAt",
    "source",
    "warnings"
  ],
  "properties": {
    "base": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "minLength": 3,
      "maxLength": 3
    },
    "quote": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "minLength": 3,
      "maxLength": 3
    },
    "symbol": {
      "type": "string",
      "pattern": "^[A-Z]{3}/[A-Z]{3}$",
      "minLength": 7,
      "maxLength": 7
    },
    "startDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "minLength": 10,
      "maxLength": 10
    },
    "endDate": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "minLength": 10,
      "maxLength": 10
    },
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 256
    },
    "points": {
      "type": "array",
      "minItems": 0,
      "maxItems": 256,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "minProperties": 3,
        "maxProperties": 3,
        "required": [
          "date",
          "rate",
          "status"
        ],
        "properties": {
          "date": {
            "type": "string",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "minLength": 10,
            "maxLength": 10
          },
          "rate": {
            "type": "number",
            "minimum": 1e-8,
            "maximum": 1000000000
          },
          "status": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32
          }
        }
      }
    },
    "retrievedAt": {
      "type": "string",
      "minLength": 20,
      "maxLength": 32
    },
    "source": {
      "type": "object",
      "additionalProperties": false,
      "minProperties": 7,
      "maxProperties": 7,
      "required": [
        "provider",
        "dataset",
        "sourceUrl",
        "freeAccessUrl",
        "retrievedAt",
        "attribution",
        "notice"
      ],
      "properties": {
        "provider": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128
        },
        "dataset": {
          "type": "string",
          "minLength": 1,
          "maxLength": 256
        },
        "sourceUrl": {
          "type": "string",
          "pattern": "^https://",
          "minLength": 9,
          "maxLength": 2048
        },
        "freeAccessUrl": {
          "type": "string",
          "pattern": "^https://",
          "minLength": 9,
          "maxLength": 2048
        },
        "retrievedAt": {
          "type": "string",
          "minLength": 20,
          "maxLength": 32
        },
        "attribution": {
          "type": "string",
          "minLength": 1,
          "maxLength": 256
        },
        "notice": {
          "type": "string",
          "minLength": 1,
          "maxLength": 512
        }
      }
    },
    "warnings": {
      "type": "array",
      "minItems": 0,
      "maxItems": 8,
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    }
  }
}

Execution limits

  • MaxInputBytes: 4096
  • MaxOutputBytes: 262144
  • MaxConcurrentExecutions: 4
  • MaxArtifacts: 0
  • MaxArtifactBytes: 0
  • RateLimitPerMinute: 30
  • MaxFetchBytes: 262144
  • MaxDecodedBytes: 262144
  • FetchTimeoutMs: 10000
  • MaxRedirects: 0
  • MaxRows: 256

Timeout: 12000 ms. Full schemas are in OpenAPI.

Copyable unpaid request

This schema-valid request returns the canonical HTTP 402 challenge without executing the service. A payment-capable client validates the challenge, signs only with prior authority and budget, and retries the identical body.

curl -i -X POST https://signalharness.ai/api/agent/services/fx_rate_history/invoke \
  -H "Content-Type: application/json" \
  --data '{"base":"EUR","quote":"USD","startDate":"2026-09-01","endDate":"2026-09-08","limit":8}'

Continue with the paid-call walkthrough →