FX Reference Data · x402 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 V2 exact payment on Base mainnet (eip155:8453) using USDC. The HTTP 402 challenge confirms the exact requirements before an authorized payment.

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 →