Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OilPriceAPI PHP SDK

The official PHP client for source-timestamped oil, gas, refined-product, futures, and related energy data from OilPriceAPI.

Packagist VersionPHP VersionTestsLicense: MIT

Create an API key | Documentation | API explorer | Pricing

Requirements

  • PHP 8.1 or newer
  • ext-curl and ext-json
  • API base URL: https://api.oilpriceapi.com
  • Auth header: Authorization: Token YOUR_API_KEY
  • Environment variable used by the executable example: OILPRICEAPI_KEY

The package has no third-party runtime dependency.

Install

composer require oilpriceapi/oilpriceapi

First Request

The canonical authenticated first request is:

GET /v1/prices/latest?by_code=BRENT_CRUDE_USD

Run the packaged, tested example:

export OILPRICEAPI_KEY="your-api-key"
php vendor/oilpriceapi/oilpriceapi/examples/quickstart.php

The same request in application code:

<?phprequire__DIR__ . '/vendor/autoload.php';
useOilPriceAPI\Client;
$client = newClient(); // reads OILPRICEAPI_KEY$brent = $client->latest('BRENT_CRUDE_USD');
printf(
"%s %.2f %s/%s as of %s (source: %s)\n",
$brent->code,
$brent->price,
$brent->currency,
$brent->unit ?? 'unknown',
$brent->updatedAt?->format(DATE_ATOM) ?? 'unknown',
$brent->source ?? 'unknown',
);

For missing configuration and actionable 401, 403, and 429 recovery, use the exact source in examples/quickstart.php. CI builds a Composer ZIP, installs it into a clean project, and runs every recovery path against fixtures.

Latest Response Compatibility

Production returns a singleton data object for the canonical latest-price request, so latest('BRENT_CRUDE_USD') returns one Price. The SDK retains support for a legacy data.prices[] envelope, returned as a list, but rejects a successful response that contains no usable price. Pass a commodity code when the caller requires a predictable single Price result.

Price is immutable and exposes code, price, currency, updatedAt, source, change24h, name, unit, type, and formatted when supplied by the API.

Several Prices In One Request

by_code accepts up to 20 comma-separated commodity codes, and the whole call counts as one request — not one per code. Batching is the cheapest way to make an allowance go further: twenty codes in one call stretches it twenty times.

$prices = $client->latest('BRENT_CRUDE_USD,WTI_USD,NATURAL_GAS_USD');
foreach ($pricesas$price) {
printf("%s %.2f %s\n", $price->code, $price->price, $price->currency);
}

One code returns a single Price; two or more return a list<Price> — the return type is Price|array, so use is_array() if the count is dynamic.

Asking for more than 20 codes returns 400 Too many commodity codes requested (max: 20, requested: N). An unrecognised code also returns 400, with a "did you mean" suggestion — so validate your code list once rather than on every poll.

For current plan allowances and the polling interval that fits them, see Rate Limiting.

Demo Request

The demo endpoint does not require an API key:

$client = new \OilPriceAPI\Client();
foreach ($client->demoPrices() as$price) {
printf("%s %.2f %s/%s\n",
$price->code,
$price->price,
$price->currency,
$price->unit ?? 'unknown',
);
}

Demo availability and limits are returned by the endpoint. Authenticated dataset access and limits vary by plan, source, and account entitlement.

Historical Prices

$day = $client->pastDay('BRENT_CRUDE_USD');
$week = $client->pastWeek('BRENT_CRUDE_USD');
$month = $client->pastMonth('BRENT_CRUDE_USD');
$year = $client->pastYear('BRENT_CRUDE_USD');

Each method returns a list of immutable Price objects.

Typed Errors

useOilPriceAPI\Exception\ApiException;
useOilPriceAPI\Exception\AuthenticationException;
useOilPriceAPI\Exception\RateLimitException;
try {
$brent = $client->latest('BRENT_CRUDE_USD');
} catch (AuthenticationException$error) {
error_log('Replace OILPRICEAPI_KEY with an active key.');
} catch (RateLimitException$error) {
error_log(sprintf('Retry after %d seconds.', $error->retryAfter ?? 0));
} catch (ApiException$error) {
if (in_array($error->statusCode, [402, 403], true)) {
error_log('Review dataset access at https://www.oilpriceapi.com/pricing');
} else {
error_log(sprintf('Request failed with HTTP %d.', $error->statusCode));
}
}

All SDK exceptions extend ApiException. RateLimitException exposes retryAfter and the server-reported limit when present.

Retries and Timeouts

The client retries 429 and 5xx responses with bounded exponential backoff and honors Retry-After.

$client = new \OilPriceAPI\Client(
apiKey: getenv('OILPRICEAPI_KEY') ?: null,
timeout: 10.0,
maxRetries: 2,
);

For tests, baseUrl, HttpTransport, and the retry sleeper are injectable. The executable example also reads OILPRICEAPI_BASE_URL when a fixture or private compatible endpoint is required.

Raw GET Escape Hatch

Use raw() for a versioned GET route that does not yet have a typed method:

$curve = $client->raw()->get('/v1/futures/brent/curve');

Availability varies by dataset, plan, source, and account entitlement. Review current access rather than relying on a plan claim copied into package metadata.

Reviewed Product Facts

The versioned, reviewed contract is product-facts.json. Mutable offer, catalog, freshness, entitlement, and data-rights claims should link to that contract instead of being duplicated in SDK documentation.

Current reviewed catalog wording: a broad catalog spanning crude oil, natural gas, refined products, futures, marine fuels, carbon markets, metals, forex, and selected energy-intelligence datasets. See the commodity catalog for current availability.

Source timestamps describe the values in each response. They do not imply one sitewide update interval: refresh cadence varies by source, market hours, dataset, and plan.

Standard plans provide API access, normalization, monitoring, and delivery; they do not grant ownership of source data or unrestricted raw-data redistribution rights. See the data usage policy.

Verify This Repository

composer validate --strict
composer install
composer test
./scripts/clean-install-smoke.sh

The guarded production smoke requires OILPRICEAPI_TEST_KEY:

OILPRICEAPI_KEY="your-test-key" php examples/smoke.php

Support

MIT licensed. See LICENSE.

About

Source-timestamped OilPriceAPI energy data for PHP with typed errors and no third-party runtime dependencies.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages