Testnet Oracles

The Chainlink Developer Relations team maintains several testnet oracles that you can use to test your implementation quickly.

Operator Contracts

Testnet Operator contracts are deployed and maintained on the following networks:

Testnet Oracle Address
Ethereum Goerli 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7
Avalanche Fuji 0x022EEA14A6010167ca026B32576D6686dD7e85d2
Polygon Mumbai 0x40193c8518BB267228Fc409a613bDbD8eC5a97b3
Binance Testnet 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7
Fantom Testnet 0xCC79157eb46F5624204f47AB42b3906cAA40eaB7
Klaytn Testnet 0xfC3BdAbD8a6A73B40010350E2a61716a21c87610

Jobs

Job IDs

To make testing simple, jobs are configured with the following properties:

  • Each request on testnets costs 0.1 LINK.
  • Each oracle will wait for 1 confirmation before processing a request.
  • Jobs have the same IDs accross testnets.
  • Parameters are required. See examples for code snippets.

Purpose Tasks Job ID Required Parameters
GET>bytes:
HTTP GET to any public API
parse the response
return arbitrary-length raw byte data bytes.
The job specs can be found here
Http
JsonParse
Ethabiencode
7da2702f37fd48e5b1b9a5715e3509b6
GET>uint256:
HTTP GET to any public API
parse the reponse
multiply the result by a multiplier
return an unsigned integer uint256 .
The job specs can be found here
Http
JsonParse
Multiply
Ethabiencode
ca98366cc7314957b8c012c72f05aeeb
GET>int256:
HTTP GET to any public API
parse the response
multiply the result by a multiplier
return a signed integer int256.
The job specs can be found here
Http
JsonParse
Multiply
Ethabiencode
fcf4140d696d44b687012232948bdd5d
GET>bool:
HTTP GET to any public API
parse the response
return a boolean bool.
The job specs can be found here
Http
JsonParse
Ethabiencode
c1c5e92880894eb6b27d3cae19670aa3
GET>string:
HTTP GET to any public API
parse the response
return a sequence of characters string.
The job specs can be found here
Http
JsonParse
Ethabiencode
7d80a6386ef543a3abb52817f6707e3b

Examples

Get > bytes

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('7da2702f37fd48e5b1b9a5715e3509b6', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://ipfs.io/ipfs/QmZgsvrA1o1C8BGCrx6mHTqR1Ui1XqbCrtbMVrRLHtuPVD?filename=big-api-response.json'
  );
  req.add('path', 'image');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
bytes public data;
string public imageUrl;
function fulfill(bytes32 requestId, bytes memory bytesData) public recordChainlinkFulfillment(requestId) {
    data = bytesData;
    imageUrl = string(data);
}

Get > uint256

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('ca98366cc7314957b8c012c72f05aeeb', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD'
  );
  req.add('path', 'RAW,ETH,USD,VOLUME24HOUR');
  req.addInt('times', 10**18); // Multiply by times value to remove decimals. Parameter required so pass '1' if the number returned doesn't have decimals
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
uint256 public volume;
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) {
  volume = _volume;
}

Get > int256

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('fcf4140d696d44b687012232948bdd5d', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD'
  );
  req.add('path', 'RAW,ETH,USD,VOLUME24HOUR');
  req.addInt('times', 10**18); // Multiply by times value to remove decimals. Parameter required so pass '1' if the number returned doesn't have decimals
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
int256 public volume;
function fulfill(bytes32 _requestId, int256 _volume) public recordChainlinkFulfillment(_requestId) {
  volume = _volume;
}

Get > bool

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('c1c5e92880894eb6b27d3cae19670aa3', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://app.proofi.com/api/verify/eip155/0xCB5085214B6318aF3dd0FBbb5E74fbF6bf332151?contract=0x2f7f7E44ca1e2Ca1A54db4222cF97ab47EE026F1'
  );
  req.add('path', 'approved');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
bool public approved;
function fulfill(bytes32 _requestId, bool _approved) public recordChainlinkFulfillment(_requestId) {
  approved = _approved;
}

Get > string

A full example can be found here.

Request method
function request() public {
  Chainlink.Request memory req = buildChainlinkRequest('7d80a6386ef543a3abb52817f6707e3b', address(this), this.fulfill.selector);
  req.add(
      'get',
      'https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&per_page=10'
  );
  req.add('path', '0,id');
  sendChainlinkRequest(req, (1 * LINK_DIVISIBILITY) / 10); // 0,1*10**18 LINK
}
Callback method
string public id;
function fulfill(bytes32 _requestId, string memory _id) public recordChainlinkFulfillment(_requestId) {
  id = _id;
}

Stay updated on the latest Chainlink news