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
x-recovea-tags: checkout,team:payments,customer:8812Comma-separated. Whitespace around each piece is trimmed. Several header lines are read as one list, so this is the same request:
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
400witherror.codeinvalid_customer_taginstead (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:8812andcustomer: 8812are 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.