Developer guide
OilPriceAPI with Python
Install the OilPriceAPI Python package (oilpriceapi) from PyPI. Start with one authenticated Brent request, verify the returned source timestamp, then build outward from the canonical quickstart.
Runtime
Python 3.8+Environment
OILPRICEAPI_KEYAuthentication
Authorization: Token YOUR_API_KEYFirst request
/v1/prices/latest?by_code=BRENT_CRUDE_USDFirst request
Prove the API path first
Store the key as OILPRICEAPI_KEY and run the request from a trusted server process. Do not expose the key in browser bundles, logs, notebooks, or shared documents.
No test-key prefix
OilPriceAPI does not issue special test keys. Use the keyless demo endpoint or fixtures for tests; keep customer keys out of CI.
python
SDK v1.10.2python -m pip install oilpriceapi#!/usr/bin/env python3
import json
import os
from typing import Dict, Union
from oilpriceapi import OilPriceAPI
def run() -> Dict[str, Union[str, None]]:
with OilPriceAPI(
api_key=os.environ["OILPRICEAPI_KEY"],
base_url=os.environ.get("OILPRICEAPI_BASE_URL"),
max_retries=1,
) as client:
price = client.prices.get("BRENT_CRUDE_USD")
return {
"commodity": price.commodity,
"currency": price.currency,
"value_type": type(price.value).__name__,
"timestamp_type": type(price.timestamp).__name__,
}
if __name__ == "__main__":
print(json.dumps(run(), sort_keys=True))
This exact example is exercised by the official SDK's fixture and guarded production CI.
Universal curl
Compare your client with the contract
curl "https://api.oilpriceapi.com/v1/prices/latest?by_code=BRENT_CRUDE_USD" \
-H "Authorization: Token YOUR_API_KEY"Expected shape
Read the timestamp from the response
{
"status": "success",
"data": {
"code": "BRENT_CRUDE_USD",
"price": 78.41,
"currency": "USD",
"created_at": "2026-03-09T12:00:00.000Z",
"type": "spot_price"
}
}Keyless first touch
Use demo data before signup
The demo route is the supported no-key path. It is rate limited and intentionally narrower than authenticated, account-entitled access.
curl "https://api.oilpriceapi.com/v1/demo/prices"Open demo response Recover without guessing
| Result | Next action |
|---|---|
| 401 | Check that the header is exactly Authorization: Token YOUR_API_KEY. |
| 402 / 403 | The dataset may require a plan or account entitlement. Check pricing or contact support. |
| 429 | Read the rate-limit response and retry after the indicated reset; do not loop immediately. |
| Timeout / 5xx | Use a bounded timeout and exponential backoff. Keep the last valid source timestamp visible. |
Executable recovery paths
Handle API failures by type
401Invalid or missing credentialView code
GET /v1/prices/latestTested SDK source#!/usr/bin/env python3
import json
import os
from typing import Dict, Union
from oilpriceapi import AuthenticationError, OilPriceAPI
def run() -> Dict[str, Union[bool, int]]:
try:
with OilPriceAPI(
api_key=os.environ["OILPRICEAPI_KEY"],
base_url=os.environ.get("OILPRICEAPI_BASE_URL"),
max_retries=1,
) as client:
client.prices.get("BRENT_CRUDE_USD")
except AuthenticationError as error:
return {"handled": True, "status_code": error.status_code or 401}
raise RuntimeError("Expected the API to reject the credential")
if __name__ == "__main__":
print(json.dumps(run(), sort_keys=True))
403Dataset entitlementView code
GET /v1/prices/latestTested SDK source#!/usr/bin/env python3
import json
import os
from typing import Dict, Union
from oilpriceapi import OilPriceAPI, OilPriceAPIError
def run() -> Dict[str, Union[bool, int]]:
try:
with OilPriceAPI(
api_key=os.environ["OILPRICEAPI_KEY"],
base_url=os.environ.get("OILPRICEAPI_BASE_URL"),
max_retries=1,
) as client:
client.prices.get("BRENT_CRUDE_USD")
except OilPriceAPIError as error:
if error.status_code != 403:
raise
return {"handled": True, "status_code": error.status_code}
raise RuntimeError("Expected the API to reject the account entitlement")
if __name__ == "__main__":
print(json.dumps(run(), sort_keys=True))
429Request limit reachedView code
GET /v1/prices/latestTested SDK source#!/usr/bin/env python3
import json
import os
from typing import Dict, Union
from oilpriceapi import OilPriceAPI, RateLimitError
def run() -> Dict[str, Union[bool, int]]:
try:
with OilPriceAPI(
api_key=os.environ["OILPRICEAPI_KEY"],
base_url=os.environ.get("OILPRICEAPI_BASE_URL"),
max_retries=1,
) as client:
client.prices.get("BRENT_CRUDE_USD")
except RateLimitError as error:
return {"handled": True, "status_code": error.status_code or 429}
raise RuntimeError("Expected the API to enforce its request limit")
if __name__ == "__main__":
print(json.dumps(run(), sort_keys=True))
TimeoutBounded timeoutView code
GET /v1/prices/latestTested SDK source#!/usr/bin/env python3
import json
import os
from typing import Dict, Union
from oilpriceapi import OilPriceAPI, TimeoutError
def run() -> Dict[str, Union[bool, str]]:
try:
with OilPriceAPI(
api_key=os.environ["OILPRICEAPI_KEY"],
base_url=os.environ.get("OILPRICEAPI_BASE_URL"),
max_retries=1,
timeout=0.05,
) as client:
client.prices.get("BRENT_CRUDE_USD")
except TimeoutError:
return {"handled": True, "error_type": "TimeoutError"}
raise RuntimeError("Expected the request to time out")
if __name__ == "__main__":
print(json.dumps(run(), sort_keys=True))
Current offer
7-day API trial
New accounts receive 10,000 trial requests without a credit card, followed by 50 requests per day on Free. Dataset access and limits vary by plan, source, and account entitlement.