openai/openai-python · error · ValueError

Expected a non-empty value for `project_id` but received {pr

Error message

Expected a non-empty value for `project_id` but received {project_id!r}

What it means

Creating a project spend alert requires the project_id path parameter; the SDK raises ValueError before the POST when project_id is empty.

Source

Thrown at src/openai/resources/admin/organization/projects/spend_alerts.py:84

        Args:
          currency: The currency for the threshold amount.

          interval: The time interval for evaluating spend against the threshold.

          notification_channel: Email notification settings for a spend alert.

          threshold_amount: The alert threshold amount, in cents.

          extra_headers: Send extra headers

          extra_query: Add additional query parameters to the request

          extra_body: Add additional JSON properties to the request

          timeout: Override the client-level default timeout for this request, in seconds
        """
        if not project_id:
            raise ValueError(f"Expected a non-empty value for `project_id` but received {project_id!r}")
        return self._post(
            path_template("/organization/projects/{project_id}/spend_alerts", project_id=project_id),
            body=maybe_transform(
                {
                    "currency": currency,
                    "interval": interval,
                    "notification_channel": notification_channel,
                    "threshold_amount": threshold_amount,
                },
                spend_alert_create_params.SpendAlertCreateParams,
            ),
            options=make_request_options(
                extra_headers=extra_headers,
                extra_query=extra_query,
                extra_body=extra_body,
                timeout=timeout,
                security={"admin_api_key_auth": True},
            ),

View on GitHub (pinned to 9917c6e28e)

Solutions

  1. Pass a real project ID such as 'proj_abc123'
  2. Validate config/env at startup so the ID is guaranteed non-empty
  3. Add unit tests asserting the ID is present before calling the SDK

Example fix

// before
client.admin.organization.projects.spend_alerts.create(project_id="", currency="usd", interval="monthly", threshold_amount=100)
// after
client.admin.organization.projects.spend_alerts.create(project_id="proj_abc123", currency="usd", interval="monthly", threshold_amount=100)
Defensive patterns

Strategy: validation

Validate before calling

if not project_id:
    raise ValueError("project_id is required to create a spend alert")
client.admin.organization.projects.spend_alerts.create(
    project_id=project_id, currency="usd", interval="monthly", threshold_amount=100
)

Type guard

def is_valid_project_id(project_id: object) -> bool:
    return isinstance(project_id, str) and bool(project_id.strip()) and project_id.startswith("proj_")

Prevention

When it happens

Trigger: Calling client.admin.organization.projects.spend_alerts.create(...) (sync) with project_id=None or ''.

Common situations: Missing PROJECT_ID env var, per-project loops where one project record lacks an ID, or wrong argument order/keyword when migrating code.

Understand the failure class

Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.

Related errors


AI-assisted analysis of openai/openai-python@9917c6e28e (2026-08-28). Data as JSON: /api/errors/9293f3bc5d55ddbb. Report an issue: GitHub.