Status: ✅ FIXED
Reporter: Idan (idan@comity.ai)
Reported Date: December 17, 2025
When requesting historical data for specific date ranges, the SDK was returning data from the wrong date range:
User Request:
client.historical.get(
commodity="WTI_USD",
start_date="2024-01-01",
end_date="2024-01-10"
)Expected: Data from 2024-01-01 to 2024-01-10
Actual (Before Fix): Data from 2025-12-17 (current date)
The generic /v1/prices endpoint with by_period[from] and by_period[to] parameters does not work correctly.
Evidence:
# This request should return 2024 data but returns 2025 data
curl "https://api.oilpriceapi.com/v1/prices?by_code=WTI_USD&by_period[from]=1704085200&by_period[to]=1704949199"
# Returns:
{
"prices": [
{"created_at": "2025-12-17T10:42:32.931Z", ...}
]
}Backend Code Location:
- File:
/home/kwaldman/code/oilpriceapi-api/app/models/price.rb(lines 75-86) - Controller:
/home/kwaldman/code/oilpriceapi-api/app/controllers/v1/prices_controller.rb(line 14)
Issue: The has_scope :by_period, using: %i[from to], type: :hash declaration is not working correctly. The scope is not being applied to the query.
Why Convenience Endpoints Work:
The convenience endpoints (/past_week, /past_month, /past_year) don't use the by_period scope. Instead, they use direct WHERE clauses with start_date and end_date parameters (see lines 299-305).
File: /home/kwaldman/code/sdks/python/oilpriceapi/resources/historical.py
Change 1: Use Correct Endpoint
# BEFORE (broken):
def _get_optimal_endpoint(self, start_date, end_date):
if start_date and end_date:
return "/v1/prices" # This endpoint ignores by_period!
return "/v1/prices/past_year"
# AFTER (fixed):
def _get_optimal_endpoint(self, start_date, end_date):
# Always use past_year endpoint which supports start_date/end_date
return "/v1/prices/past_year"Change 2: Use Correct Parameters
# BEFORE (broken):
params["by_period[from]"] = str(unix_timestamp_from)
params["by_period[to]"] = str(unix_timestamp_to)
# AFTER (fixed):
params["start_date"] = "2024-01-01" # ISO date string
params["end_date"] = "2024-01-10" # ISO date string
params["interval"] = "raw" # Get raw data, not aggregatedQuery: commodity='WTI_USD', start_date='2024-01-01', end_date='2024-01-10'
Result: Data from 2025-12-17 ❌ WRONG DATES
Query: commodity='WTI_USD', start_date='2024-01-01', end_date='2024-01-10'
Result: Data from 2024-01-09 ✅ CORRECT DATES
Test 2: Valid Commodity, Specific Date Range
----------------------------------------------------------------------
✓ Request succeeded (got 100 records)
Date range check:
Requested: 2024-01-01 to 2024-01-10
First record: 2024-01-09 23:59:34.676000+00:00
Last record: 2024-01-09 23:10:02.748000+00:00
✅ CORRECT: All dates within requested range
✅ CORRECT: All records are WTI_USD
Priority: P1 (High - affects all users using by_period parameter)
Issue: The by_period scope in /v1/prices endpoint is not being applied
File: /home/kwaldman/code/oilpriceapi-api/app/controllers/v1/prices_controller.rb
Problem Code (Line 14):
has_scope :by_period, using: %i[from to], type: :hashScope Definition (price.rb lines 75-86):
scope :by_period, -> from, to {
from_time = Time.at(from.to_i)
to_time = Time.at(to.to_i)
if from_time > 1.day.from_now
none
else
where('created_at BETWEEN ? AND ?', from_time, to_time)
end
}Why It Doesn't Work:
The has_scope gem is not properly applying the scope when apply_scopes(Price) is called. This could be due to:
- Parameter parsing issues (hash keys not being extracted)
- Scope not being included in the chain
- has_scope gem version compatibility issue
Recommended Fix: Follow the pattern used in convenience endpoints - use direct WHERE clauses instead of has_scope:
# In prices_controller.rb index action
if params[:by_period].is_a?(Hash)
from_time = Time.at(params[:by_period][:from].to_i)
to_time = Time.at(params[:by_period][:to].to_i)
prices = Price.where('created_at BETWEEN ? AND ?', from_time, to_time)
else
prices = Price.all
endImpact: This fix would allow the SDK to use the more efficient /v1/prices endpoint instead of always routing through /v1/prices/past_year.
Issue: SDK returns unclear error for invalid commodity codes
Test Case:
client.historical.get(commodity="INVALID_NONSENSE")Current Behavior: OilPriceAPIError: [400] Unexpected error: 400
Desired Behavior: More specific error message like "Invalid commodity code: INVALID_NONSENSE"
Priority: P2 (Medium - affects UX but not data correctness)
- Updated: December 17, 2025
- Files changed: 1 (
oilpriceapi/resources/historical.py)
- ✅ All test cases pass
- ✅ Verified with production API
- ✅ Idan's exact query now returns correct data
- ✅ Deploy SDK fix to PyPI
- 📧 Notify Idan that fix is deployed
- 🐛 Create GitHub issue for backend
by_periodbug - 📊 Monitor SDK usage to ensure no regressions
What was broken: SDK used /v1/prices with by_period[from/to] parameters which the backend ignores
What we fixed: SDK now uses /v1/prices/past_year with start_date/end_date parameters which the backend handles correctly
What still needs fixing: Backend by_period scope should be fixed to work as originally intended
User impact: Idan and all other users querying historical data with custom date ranges will now receive correct data