Skip to content

Delivery quote

POST
/v1/quote
curl --request POST \
--url https://api.infiniteaudience.ai/v1/quote \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "audience_id": "example", "destination": "download", "template_id": "example", "field_list": [ "example" ], "include_unmatched": true, "output_format": "csv", "output_compression": "none" }'

Returns a price estimate for a proposed delivery without executing it. Provide the audience ID, destination, and optionally field_list or template_id (mutually exclusive) to receive a structured cost breakdown and credit balance information. If neither is provided, the audience fields are used, or audience plus feature-store fields for a pure matched composition. No delivery or charge is made. A fresh quote stores a pending quote and updates the audience’s current quote reference and price; a completed re-export does not create another pending quote. Download is the currently active destination; LiveRamp and Narrative return 503 before a quote or billable record is created until their partner pushes are implemented. Returns two cost figures: cost_estimate is license-aware (identities this audience already holds an active 12-month license for elsewhere are excluded from the billable count) and max_cost_estimate is the worst-case ceiling assuming no identity is pre-licensed. See license_pricing.status for whether cost_estimate reflects a live or cached computation, or degraded non-blockingly to the max figure. Requires ‘discovery’ scope.

Media typeapplication/json
object
audience_id
required

ID of the audience to quote a delivery for.

string
destination
required

Intended destination. liveramp and narrative currently return DELIVERY_DESTINATION_UNAVAILABLE without billing.

string
Allowed values: download liveramp narrative
template_id

Enrichment template ID. standard_iag is valid; standard_enrichment is valid for pure matched exports and matching. Mutually exclusive with field_list. If neither is provided, the enrichment set is used for pure matched output; otherwise the audience set is used.

string | null
field_list

Explicit attribute list — every attribute must be a field allowed for this output (see GET /v1/catalog/fields). Mutually exclusive with template_id. If neither is provided, the enrichment set is used for pure matched output; otherwise the audience set is used.

Array<string> | null
include_unmatched

Include unmatched input rows in matched-audience output.

boolean
default: true
output_format

Artifact format being quoted, independent of matched-input format.

string
default: csv
Allowed values: csv avro json jsonl
output_compression

Gzip is supported for csv/json/jsonl. Avro uses native DEFLATE and rejects outer gzip.

string
default: none
Allowed values: none gzip

Price quote — no commitment made.

Media typeapplication/json
object
audience_id
required
string
subtype
required
string
Allowed values: filter matched similarity propensity
destination
required
string
template_id
required
string | null
field_list
required
Array<string> | null
output_format
required
string
Allowed values: csv avro json jsonl
output_compression
required
string
Allowed values: none gzip
already_delivered
required

true if this billing identity (audience composition and segment revisions, resolved fields, unmatched-row policy, and destination) has already been delivered. Artifact format/compression are deliberately excluded, so changing only those axes permits a free re-export.

boolean
quote_id
required

ID of the persisted quote backing this estimate. null when already_delivered is true (a free re-delivery has no pending cost, so nothing is persisted).

string | null
cost_estimate
required

The license-aware, expected-to-be-charged estimate — reflects any active licenses this audience’s identities already hold elsewhere (see license_pricing.status). Equals max_cost_estimate exactly when license_pricing.status is unavailable.

object
base_cost
required

Base audience-delivery cost.

number
match_cost
required

One-time deferred file-match cost included only until the underlying run is first delivered.

number
field_cost
required

Total surcharge for requested attributes.

number
destination_cost
required

Destination surcharge (0 for download).

number
total_cost
required

Sum of all cost components.

number
unit_price
required

Effective cost per record.

number
billing_count
required

Number of records that will be billed.

integer
max_cost_estimate
required

The worst-case ceiling, computed as if no identity in this audience were already licensed anywhere. Always present and always the same value regardless of license_pricing.status — use this for a stable upper bound.

object
base_cost
required

Base audience-delivery cost.

number
match_cost
required

One-time deferred file-match cost included only until the underlying run is first delivered.

number
field_cost
required

Total surcharge for requested attributes.

number
destination_cost
required

Destination surcharge (0 for download).

number
total_cost
required

Sum of all cost components.

number
unit_price
required

Effective cost per record.

number
billing_count
required

Number of records that will be billed.

integer
license_pricing
required
object
status
required

Whether cost_estimate reflects a freshly-computed license split (live), a recent cached one (cached, still authoritative — only the underlying counts are reused, dollars are always recomputed from current rates), or could not be determined in time (unavailable — cost_estimate equals max_cost_estimate exactly in this case, so no consumer sees a misleading number).

string
Allowed values: live cached unavailable
evaluated_at
required

When the license split backing cost_estimate was computed. For a cached split this is the ORIGINAL computation time, not now — use it to judge staleness. Null when status is unavailable.

string | null format: date-time
already_licensed_count
required

How many of this audience’s candidate identities already hold an active license elsewhere and were therefore excluded from cost_estimate’s billable count. Null when status is unavailable.

integer | null
record_count
required

Current audience size.

integer
match_count
required

Matched subtype only — resolved rows from most recent delivery.

integer | null
billing_model
required

Resolved from the org’s own billing_model, or ‘postpay’ for parent_billed (agency) orgs. Determines which of available_balance/shortfall vs. budget_ceiling/accrued_balance is populated below.

string
Allowed values: prepay postpay
billing_authority
required

Whether the org or an agency owns this billing route.

string
Allowed values: self agency
billing_projection
required

Freshness of the provider-backed billing projection.

object
projected_at
required
string | null format: date-time
stale
required
boolean
available_balance
required

Prepay only — effective credit balance after holds. Null for postpay/agency orgs, which have no credit balance.

number | null
sufficient_balance
required

Prepay: whether available_balance ≥ total_cost. Postpay/agency: whether this delivery would stay within the org’s/agency’s optional budget ceiling (always true when no ceiling is set).

boolean
shortfall
required

Prepay only — credits needed beyond current balance (0 when sufficient). Null for postpay/agency.

number | null
budget_ceiling
required

Postpay/agency only — the org’s configured budget ceiling in USD. Null if unset (unlimited) or for prepay.

number | null
accrued_balance
required

Postpay/agency only — accrued USD spend so far this cycle. Null for prepay.

number | null
Example
{
"audience_id": "aud_abc123",
"subtype": "filter",
"destination": "download",
"template_id": "standard_iag",
"field_list": null,
"output_format": "csv",
"output_compression": "none",
"already_delivered": false,
"quote_id": "q_abc123",
"cost_estimate": {
"base_cost": 0.08,
"match_cost": 0,
"field_cost": 0.04,
"destination_cost": 0,
"total_cost": 0.12,
"unit_price": 0.0015,
"billing_count": 80000
},
"max_cost_estimate": {
"base_cost": 0.08,
"match_cost": 0,
"field_cost": 0.04,
"destination_cost": 0,
"total_cost": 0.12,
"unit_price": 0.0015,
"billing_count": 80000
},
"license_pricing": {
"status": "live",
"evaluated_at": "2026-08-21T12:00:00.000Z",
"already_licensed_count": 0
},
"record_count": 80000,
"match_count": null,
"billing_model": "prepay",
"billing_authority": "self",
"billing_projection": {
"projected_at": "2026-08-21T12:00:00.000Z",
"stale": false
},
"available_balance": 5,
"sufficient_balance": true,
"shortfall": 0,
"budget_ceiling": null,
"accrued_balance": null
}

Invalid request — malformed body, missing required attribute, or failed validation. See error and message for details.

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
next_step

Public action for correcting the request or retrying later.

string
issues
Array<object>
object
path
required

JSON path to the invalid filter field or value.

string
code
required
string
Allowed values: INVALID_FILTER_SHAPE UNKNOWN_FILTER_FIELD FIELD_NOT_FILTERABLE UNSUPPORTED_FILTER_OPERATOR UNSUPPORTED_TEXT_COMPARISON INVALID_FILTER_VALUE INVALID_ENUM_VALUE AMBIGUOUS_ENUM_VALUE
message
required
string
suggestions
Array<string>
key
additional properties
any
Examples
Examplevalidation_error
{
"error": "Bad Request",
"code": "MISSING_SEGMENTS",
"message": "segment_ids is required for filter audiences."
}

Missing or invalid Bearer token. Obtain one via POST /v1/auth/token. When a token was supplied but rejected, code distinguishes TOKEN_EXPIRED (the token’s lifetime has passed — request a new one via POST /v1/auth/token and retry) from TOKEN_INVALID (malformed or revoked — re-authenticate).

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
next_step

Public action for correcting the request or retrying later.

string
issues
Array<object>
object
path
required

JSON path to the invalid filter field or value.

string
code
required
string
Allowed values: INVALID_FILTER_SHAPE UNKNOWN_FILTER_FIELD FIELD_NOT_FILTERABLE UNSUPPORTED_FILTER_OPERATOR UNSUPPORTED_TEXT_COMPARISON INVALID_FILTER_VALUE INVALID_ENUM_VALUE AMBIGUOUS_ENUM_VALUE
message
required
string
suggestions
Array<string>
key
additional properties
any
Examples
{
"error": "Unauthorized: Missing or invalid Authorization header"
}

Token is valid but lacks the required scope for this endpoint. Check the endpoint description for the required scope (discovery, purchase, or account).

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
next_step

Public action for correcting the request or retrying later.

string
issues
Array<object>
object
path
required

JSON path to the invalid filter field or value.

string
code
required
string
Allowed values: INVALID_FILTER_SHAPE UNKNOWN_FILTER_FIELD FIELD_NOT_FILTERABLE UNSUPPORTED_FILTER_OPERATOR UNSUPPORTED_TEXT_COMPARISON INVALID_FILTER_VALUE INVALID_ENUM_VALUE AMBIGUOUS_ENUM_VALUE
message
required
string
suggestions
Array<string>
key
additional properties
any
Examples
Examplemissing_scope
{
"error": "SCOPE_REQUIRED",
"message": "This endpoint requires the creator scope."
}

Resource not found or not accessible to the calling org.

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
next_step

Public action for correcting the request or retrying later.

string
issues
Array<object>
object
path
required

JSON path to the invalid filter field or value.

string
code
required
string
Allowed values: INVALID_FILTER_SHAPE UNKNOWN_FILTER_FIELD FIELD_NOT_FILTERABLE UNSUPPORTED_FILTER_OPERATOR UNSUPPORTED_TEXT_COMPARISON INVALID_FILTER_VALUE INVALID_ENUM_VALUE AMBIGUOUS_ENUM_VALUE
message
required
string
suggestions
Array<string>
key
additional properties
any
Examples
Examplenot_found
{
"error": "Audience not found"
}

A required billing provider partnership is temporarily unavailable.

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
next_step

Public action for correcting the request or retrying later.

string
issues
Array<object>
object
path
required

JSON path to the invalid filter field or value.

string
code
required
string
Allowed values: INVALID_FILTER_SHAPE UNKNOWN_FILTER_FIELD FIELD_NOT_FILTERABLE UNSUPPORTED_FILTER_OPERATOR UNSUPPORTED_TEXT_COMPARISON INVALID_FILTER_VALUE INVALID_ENUM_VALUE AMBIGUOUS_ENUM_VALUE
message
required
string
suggestions
Array<string>
key
additional properties
any
Example
{
"issues": [
{
"code": "INVALID_FILTER_SHAPE"
}
]
}