Custom provider (FOCUS)
Track spend from any tool StackSpend doesn't natively support by pushing cost data in the FOCUS standard, via the API or a CSV import.
Custom provider (FOCUS)
Any source · push (API or CSV) · 5 min setup
What is a custom provider?
A custom provider lets you bring spend into StackSpend from any tool that isn't in our built-in list — an internal platform, a niche SaaS, or a vendor we don't yet have a native connector for. Instead of StackSpend pulling the data, you push it: either by POSTing cost rows to our API, or by uploading a CSV in the app and mapping your columns. Once it's in, custom-provider spend flows through the same dashboards, anomaly detection, forecasts and savings as every other provider.
Why it exists
Most teams have long-tail cost sources that never make it into a cost tool, leaving dashboards and budgets incomplete. Custom providers close that gap. The data format is the StackSpend FOCUS Profile — our versioned profile of the FinOps FOCUS 1.2 standard. Because it uses standard FOCUS column names, a FOCUS export from another tool (for example a Vantage custom-provider export) maps straight in.
Set up a custom provider
Create the provider
Copy your ingest key
Send your data
Verify
The FOCUS Profile format
Each row is one charge. Send fully-priced rows — StackSpend stores the cost you provide (we don't price raw usage). Body shape: { "format": "stackspend.focus", "version": "1", "rows": [ … ] }.
| Column | Required | Notes |
|---|---|---|
| ChargePeriodStart | Yes | ISO 8601 or YYYY-MM-DD. |
| BilledCost | Yes | Gross charge. Negative for credits/refunds. |
| ServiceName | Yes | What the charge is for. |
| ChargeCategory | Yes | Usage, Purchase, Tax, Credit, or Adjustment. |
| EffectiveCost | Recommended | Net/amortized cost used by analytics. Defaults to BilledCost. |
| ChargePeriodEnd | Recommended | Exclusive end of the period. |
| BillingCurrency | Recommended | ISO 4217. Defaults to the provider's default currency. |
| RegionId, ResourceId, BillingAccountId, SubAccountId, ConsumedQuantity/Unit, Tags, … | Optional | Standard FOCUS dimensions; mapped or preserved on the line item. |
Example request
curl -X POST "https://ingest.stackspend.app/api/v1/public/ingest/focus/YOUR_CONNECTION_ID" \
-H "Authorization: Bearer YOUR_INGEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"format": "stackspend.focus",
"version": "1",
"rows": [
{
"ChargePeriodStart": "2026-06-01",
"ChargePeriodEnd": "2026-06-02",
"BilledCost": 12.50,
"EffectiveCost": 12.50,
"BillingCurrency": "USD",
"ChargeCategory": "Usage",
"ServiceName": "Compute",
"RegionId": "us-east-1",
"Tags": { "env": "prod" }
}
]
}'Frequently asked questions
How does StackSpend get the data for a custom provider?
You push it. Unlike native connectors, a custom provider is never pulled or synced on a schedule — StackSpend only holds the data you send, either by POSTing FOCUS rows to the ingest API or by uploading a CSV in the app. Send a new batch whenever your costs update, such as a daily job or a monthly CSV upload.
What credential do I need?
You need the scoped ingest key generated when you create the provider. It is shown once on creation, and you can regenerate a new one from the provider's API key & ingest URL tab, which also shows your full ingest URL with the connection id baked in.
What data format does a custom provider use?
The StackSpend FOCUS Profile, a versioned profile of the FinOps FOCUS 1.2 standard. Because it uses standard FOCUS column names, a FOCUS export from another tool maps straight in. Each row is one fully-priced charge — StackSpend stores the cost you provide and does not price raw usage.
How do I confirm my data landed?
Open the provider's History tab to see each ingest batch, including rows received, cost line items created, and status. Once ingested, custom-provider spend flows through the same dashboards, anomaly detection, forecasts, and savings as every other provider.