Python SDK Ingest API Reference
Overview
This document provides detailed reference information for the client.ingest resource in the Pay-i Python SDK. For usage examples and best practices, see the Python SDK Ingest Guide.
Method Reference
| Method | Description | Return Type | Access Pattern | REST API Endpoint |
|---|---|---|---|---|
units() | Submit a single event with usage data | IngestResponse | response.xproxy_result.field | REST Ingest API |
Note: For bulk event ingestion options, please contact [email protected].
Response Types
IngestResponse
Returned by the units() method.
IngestResponse:
event_timestamp: datetime # Timestamp of the event being tracked
ingest_timestamp: datetime # Timestamp when Pay-i received/processed the event
request_id: str # Unique identifier for the ingest request
xproxy_result: XproxyResult # Detailed result informationXProxyResult
Contains detailed information about cost, limit status, and other metadata.
XProxyResult:
blocked_limit_ids: Optional[List[str]] # IDs of limits that blocked the request
cost: Optional[Cost] # Cost breakdown for the request
experience_id: Optional[str] # DEPRECATED: Associated experience ID
limits: Optional[Dict[str, Limits]] # Status of affected limits
request_id: Optional[str] # Unique ID for the request
request_tags: Optional[List[str]] # Tags associated with the request
resource_id: Optional[str] # Resource identifier
unknown_units: Optional[Dict[str, IngestUnits]] # Any units that couldn't be processed
use_case_id: Optional[str] # Associated use case ID
use_case_step: Optional[str] # Step within the use case
user_id: Optional[str] # Associated user IDCost
Provides a breakdown of costs for the request.
Cost:
currency: Optional[Literal["usd"]] # Currency (currently only USD)
input: Optional[PayICommonModelsBudgetManagementCostDetailsBase] # Input cost details
output: Optional[PayICommonModelsBudgetManagementCostDetailsBase] # Output cost details
total: Optional[CostDetails] # Total cost informationCostDetails
Provides detailed cost information.
CostDetails:
base: float # Base cost of the request
overage_base: Optional[float] # Additional cost from exceeding quota
overrun_base: Optional[float] # Additional cost from overrunLimits (LimitStatus)
Tracks the status of any limits applied to the request.
Limits:
state: Optional[Literal["ok", "blocked", "blocked_external", "exceeded", "overrun", "failed"]]The possible states are:
ok: The limit was checked and not exceededblocked: The request was blocked due to this limitblocked_external: The request was blocked by an external systemexceeded: The limit was exceeded but the request was allowedoverrun: The limit was overrun (beyond the exceeded threshold)failed: There was an error checking the limit
IngestUnits
Represents the units of usage being tracked.
IngestUnits:
input: Optional[int] # Number of input units (e.g., tokens)
output: Optional[int] # Number of output units (e.g., tokens)Method Details
units()
client.ingest.units(
category: str, # Required
resource: str, # Required
units: Dict[str, IngestUnits], # Required
end_to_end_latency_ms: Optional[int] = None,
event_timestamp: Union[str, datetime, None] = None,
experience_properties: Optional[Dict[str, str]] = None,
http_status_code: Optional[int] = None,
properties: Optional[Dict[str, str]] = None,
provider_request_headers: Optional[Iterable[PayICommonModelsAPIRouterHeaderInfoParam]] = None,
provider_request_json: Optional[str] = None,
provider_request_reasoning_json: Optional[str] = None,
provider_response_function_calls: Optional[Iterable[ProviderResponseFunctionCall]] = None,
provider_response_headers: Optional[Iterable[PayICommonModelsAPIRouterHeaderInfoParam]] = None,
provider_response_id: Optional[str] = None,
provider_response_json: Union[str, List[str], None] = None,
provider_uri: Optional[str] = None,
time_to_first_completion_token_ms: Optional[int] = None,
time_to_first_token_ms: Optional[int] = None,
use_case_properties: Optional[Dict[str, str]] = None,
limit_ids: Optional[list[str]] = None,
request_tags: Optional[list[str]] = None,
experience_id: Optional[str] = None, # DEPRECATED
experience_name: Optional[str] = None, # DEPRECATED
use_case_id: Optional[str] = None,
use_case_name: Optional[str] = None,
use_case_step: Optional[str] = None,
use_case_version: Optional[int] = None,
user_id: Optional[str] = None,
resource_scope: Optional[str] = None,
extra_headers: Dict[str, str] = None,
extra_query: Dict[str, str] = None,
extra_body: Dict[str, Any] = None,
timeout: Optional[float] = None
) -> IngestResponseSubmits a single event with usage data to Pay-i.
Calls: REST Ingest API REST API endpoint
Parameters:
Required Parameters:
category(str): The category the resource belongs to (e.g., "system.openai")resource(str): Specific resource being used (e.g., "gpt-4")units(Dict[str, IngestUnits]): Dictionary containing unit types with input and output values (e.g.,{"text": {"input": 100, "output": 200}})
Optional Parameters:
end_to_end_latency_ms(int): End-to-end latency in millisecondsevent_timestamp(str|datetime|None): Timestamp of the event (ISO 8601 format if string)experience_properties(Dict[str, str]): DEPRECATED: Properties for the experiencehttp_status_code(int): HTTP status code of the provider responseproperties(Dict[str, str]): Key-value properties for the eventprovider_request_headers(Iterable[PayICommonModelsAPIRouterHeaderInfoParam]): Headers sent to the providerprovider_request_json(str): JSON string of the request sent to the providerprovider_request_reasoning_json(str): JSON string of reasoning info sent to providerprovider_response_function_calls(Iterable[ProviderResponseFunctionCall]): Function calls in the responseprovider_response_headers(Iterable[PayICommonModelsAPIRouterHeaderInfoParam]): Headers from the provider responseprovider_response_id(str): Provider's ID for the responseprovider_response_json(str|List[str]|None): JSON string or list of response from providerprovider_uri(str): URI of the provider endpointtime_to_first_completion_token_ms(int): Time to first completion token in millisecondstime_to_first_token_ms(int): Time to first token in millisecondsuse_case_properties(Dict[str, str]): Properties for the use caselimit_ids(list[str]): List of limit IDs to associate with the requestrequest_tags(list[str]): Tags to associate with the requestexperience_id(str): DEPRECATED: ID of the experience (useuse_case_idinstead)experience_name(str): DEPRECATED: Name of the experience (useuse_case_nameinstead)use_case_id(str): ID of the use case instanceuse_case_name(str): Name of the use caseuse_case_step(str): Current step within the use caseuse_case_version(int): Version of the use caseuser_id(str): ID of the user associated with the requestresource_scope(str): Scope of the resource
Additional Request Configuration:
extra_headers(Dict[str, str]): Additional headers for the requestextra_query(Dict[str, str]): Additional query parametersextra_body(Dict[str, Any]): Additional body parameterstimeout(float): Request timeout in seconds
Returns: An IngestResponse object containing:
request_id: Unique identifier for the ingest requestevent_timestamp: Timestamp of the event being trackedingest_timestamp: Timestamp when Pay-i received/processed the eventxproxy_result: Detailed information including cost, limits status, and request metadata
Example:
from payi import Payi
from payi.lib.helpers import PayiCategories
client = Payi() # API key loaded from PAYI_API_KEY environment variable
response = client.ingest.units(
category=PayiCategories.openai,
resource="gpt-4o",
units={
"text": {
"input": 156, # Number of input tokens
"output": 1746 # Number of output tokens
}
},
user_id="user-123",
request_tags=["customer-support", "documentation"],
use_case_name="content-generation",
use_case_step="draft-creation",
properties={
"model_version": "4o-20240502",
"application": "content-management-system"
}
)
# Check tracking status and cost information
print(f"Request ID: {response.request_id}")
print(f"Event timestamp: {response.event_timestamp}")
print(f"Base cost: ${response.xproxy_result.cost.total.base}")Implementation Notes
The following implementation details may be helpful when using the Python SDK:
-
The SDK automatically converts parameter lists like
limit_idsandrequest_tagsinto comma-separated strings for header transmission. -
For timestamp handling, the
event_timestampparameter accepts:- A string in ISO 8601 format (e.g., "2024-04-15T14:22:36Z")
- A Python
datetimeobject - None (defaults to the current time in UTC)
-
The
unitsparameter requires a specific structure:- A dictionary with unit type keys (typically "text")
- Each unit type maps to an object with "input" and/or "output" fields
- Both fields should be integers representing the count (e.g., tokens)
-
Experience-related parameters (
experience_id,experience_name) are deprecated in favor of use case parameters (use_case_id,use_case_name). The SDK handles backward compatibility, but new code should use the use case parameters. -
Parameters can be passed as direct method arguments or through dictionary unpacking, which is useful for dynamic construction:
params = { "category": PayiCategories.openai, "resource": "gpt-4o", "units": {"text": {"input": 100, "output": 200}}, "user_id": "user-123" } response = client.ingest.units(**params) -
The SDK handles proper conversion of
use_case_versionfrom an integer to a string when sending to the API.
Updated about 2 months ago
