Sign in

Concepts

Tags

The x-recovea-tags request header: its shape, its limits, the four namespaces, and the rule that it never reaches your provider.

On this page

One request header carries every label you want on a request: which team, which feature, which of your own customers, which end user. The gateway stores the values so you can cut your spend by them. It compares and counts them; it never looks up what they mean.

The shape

HTTP
x-recovea-tags: checkout,team:payments,customer:8812

Comma-separated. Whitespace around each piece is trimmed. Several header lines are read as one list, so this is the same request:

HTTP
x-recovea-tags: checkout
x-recovea-tags: team:payments,customer:8812
Limit Value
Tags per request 32
Characters per tag 128

A 33rd tag is dropped and counted, never an error, and a tag longer than 128 characters is cut to 128. An attribution cut bounds a tag's value at 128 characters after its namespace prefix, never the whole tag (Attribution cuts). The header never fails a request because of its shape.

A second header, x-recovea-project, carries one project name for the request under the same 128-character bound (Organization and keys).

The four namespaces

A tag that starts with one of four prefixes is a dimension: it is kept in its own column so you can cut your spend by it. Any other tag is a plain label. The set is closed: an unknown prefix such as foo: is not an error, it is a plain label.

Prefix What it is for
team: which of your teams made the request
feature: which feature of your product
customer: which of your customers it serves
enduser: one person inside one of your customers

The value after the colon is opaque. Nothing validates or interprets it, and nothing resolves it to a person.

customer: is read more strictly than the other three, because two customers must never collapse into one, and because a cap on one of your customers is keyed by it (Customer spending caps):

  • It is never cut short. A value longer than 128 characters, or one that is not valid UTF-8, is dropped instead, and the request is counted with no customer. Two ids that shared their first 128 characters would otherwise count as one customer. On an organization holding an armed customer spending cap, such a value, or an empty one, is refused 400 with error.code invalid_customer_tag instead (The tag).
  • The first one decides. Send one customer: tag per request; if you send more, the first is the one kept.
  • Case and spaces count. customer:8812 and customer: 8812 are two customers. Whitespace around the whole piece is trimmed.
  • Put it on the call, not on the client. The customer changes from one request to the next, and a header set once when the client is built labels every request with the first customer.

The header never reaches your provider

x-recovea-tags and x-recovea-project are Recovea's own headers. They are removed before the request is forwarded, on every path, including a fail-open pass. Everything else you send goes through as you sent it.

What is done with a value, and what never is

  • It is compared, to find the right counter, and counted against.
  • It lands on the record for the request, so you can cut your own spend by it on the platform's Attribution page and in its CSV export.
  • It is never resolved to a person, an email, a company or a row in anybody's system. There is no such column.
  • It is never put in a refusal body or a response header.
  • Recovea never contacts your customers.