Upload household data

Send your subscriber data to LtvAdx as a CSV, check it first with Validate, read the result and keep it fresh so your households stay in audiences.

Your household data is what makes addressable TV work. LtvAdx builds the audiences advertisers buy from the rows you upload, and you earn when an addressable impression reaches one of your households. Upload a file on this page, or send the same rows through the API.

Each row describes one subscriber. A subscriber who is not in your latest upload leaves targeting 30 days after the last upload that named them, so this is a job you repeat.

Before you start

  • Your account must be active. While LtvAdx has not approved your operator account, or after it is suspended, the buttons on this page are off and a banner says why. See Account status, suspension and payout holds.
  • Your seat must be allowed to upload. Owners, admins and inventory managers can upload. Analysts and finance seats can open the page but not upload. They see the note "Your team role can view signals but not upload them. Ask an owner, admin or manager."
  • You must have the right to send the data. Read What household data you may send first. Before you can upload, the page asks you to tick a confirmation that you have your subscribers' consent, or another lawful basis, for this data. A check with Validate does not need it.
  • Each subscriber needs an ID. Use your own subscriber, smart-card or set-top-box number, the same one your boxes send with ad requests. It can hold letters, digits and the characters . _ : -, up to 128 characters, with no spaces. LtvAdx refuses a value that looks like an email address. It cannot tell a phone number from a card number, so check what your system puts in this field.

The file

Use a CSV with a header row. The only required column is subscriberId. Every other column is optional. Files can end lines with LF or CRLF, and a cell that holds a comma goes in double quotes. A file or pasted text works, and .csv and .txt files are accepted.

Leave a cell blank, or leave a column out, to keep what LtvAdx already holds for that subscriber. You can send one column for every subscriber and change nothing else.

ColumnWhat to send
subscriberIdRequired. Your own ID for the subscriber.
householdIdOnly if LtvAdx gave you the household's ID. Most files leave it out.
optedOuttrue if the subscriber opted out of targeted ads. false withdraws your own earlier opt-out. See Record opt-outs and remove subscribers.
removetrue to remove the subscriber now.
primaryViewerGenderMALE, FEMALE or UNKNOWN
primaryViewerAgeBracket18-24, 25-34, 35-44, 45-54, 55-64 or 65+
arpuBandLOW, MID or HIGH (the subscriber's monthly value to you)
primaryLanguage, contentPreferredLanguageA two-letter ISO 639-1 code such as hi or en
resolutionClassSD, HD, FULL_HD or 4K
packageTierSD, HD, HD_PLUS, 4K or PLATINUM
preferredOttTierFREE, BASIC, STANDARD or PREMIUM
childrenAgeRangeUNDER_5, 5-12, 13-17 or MIXED
hasChildren, isPostpaidtrue or false (yes, no, 1 and 0 also work)
loyaltyYears, householdSize, screenSizeInches, deviceYearWhole numbers
primetimeAffinity, weekendAffinity, bingeScoreNumbers from 0 to 1
avgDailyViewHoursA number
ottAppsInstalledSeveral apps in one cell, separated by ;, for example NETFLIX;PRIME;HOTSTAR. Capitals and spacing do not matter.
country, region, state, city, dma, postalCode, timezoneLocation text
tvManufacturer, tvModel, osVersionDevice text. Capitals and spacing do not matter for the make.

Capital letters do not matter for the fixed lists, so male is stored as MALE.

App and TV make names are matched whatever their case or spacing. LtvAdx turns each run of spaces or symbols into one underscore and uses capitals, so "Mi TV" and "MI TV" both become MI_TV, "Prime Video" becomes PRIME_VIDEO and a lower-case netflix counts as NETFLIX. You do not need to rewrite your names.

What each column does today

Not every column builds an audience yet. Send the ones you hold, but know what they do.

  • Build audiences (the page lists these first under All columns): primaryViewerGender, primaryViewerAgeBracket, arpuBand, primaryLanguage, contentPreferredLanguage, resolutionClass, tvManufacturer, ottAppsInstalled, hasChildren, loyaltyYears, packageTier, isPostpaid, primetimeAffinity and bingeScore. Audience Segments lists each rule.
  • Stored, but no audience is built from them today (listed second under All columns): the location columns, tvModel, osVersion, screenSizeInches, deviceYear, householdSize, childrenAgeRange, weekendAffinity, avgDailyViewHours and preferredOttTier.
  • Stored but never used to target: gender UNKNOWN and income band LOW. They appear on Household Data and build no audience.
  • English premium streaming counts Netflix and Amazon Prime Video. Send them as NETFLIX, PRIME, PRIME_VIDEO, AMAZON_PRIME or AMAZON_PRIME_VIDEO, in any case or spacing.
  • An audience that is too small is left empty. See Audience Segments.

Steps

  1. Open Signal Upload.
  2. Select Choose CSV File and pick your file, or paste the rows into the box under "or paste CSV below".
  3. Look at the line under the box, which says how many rows were detected. Check the preview of the first 5 rows.
  4. Read any warnings under the box. The page lists columns it does not recognise under "Ignored, not recognised columns" and does not send them. It lists rows it left out because a value cannot be read, for example hasChildren must be true or false, not maybe.
  5. Select Validate. This checks every row against the same rules as a real upload and saves nothing. The result says "Check complete: nothing was saved".
  6. Fix what the check reports, then tick the confirmation that you have your subscribers' consent, or another lawful basis, for this data. It also says you have marked every subscriber who opted out or asked to be removed. Upload Signals stays off until you tick it.
  7. Select Upload Signals.
  8. Read the result panel. When it says "Upload Complete", your rows are saved.
  9. Scroll down to Upload history and confirm the call is listed.

A file with more than 50,000 rows is sent in parts for you, and the page shows "X of Y rows sent". If a part fails, the page tells you how many rows were sent before it stopped. Those earlier rows were saved, so fix the cause and upload the rest. Uploading the same rows again is safe: a row for a subscriber you already sent changes only the columns it names.

What happens next

The result panel shows these counts:

CountMeaning
Total RowsRows in the call
Processed (Valid in a check)Rows that passed
CreatedSubscribers new to LtvAdx
UpdatedSubscribers you had already sent
Opted outRows that opted a subscriber out
RemovedRows that removed a subscriber
RejectedRows refused, with the reason

Under the counts, "Rejected by reason" groups the refusals, and the first 20 refused rows are listed with their row number.

LtvAdx rebuilds audiences about a minute after an upload, and every 30 minutes besides. Check Audience Segments after that.

Upload history lists your last 30 calls with the time in UTC, whether they came from the page or the API, how many rows, how many were saved, how many were rejected and why. A check shows "(check)" after its source. LtvAdx keeps the log for 400 days.

The tile "Your household rows" at the top of the page counts every row you hold, opted-out subscribers included.

Keep your data fresh

A household leaves targeting 30 days after the last upload that named it. The page asks you to upload at least weekly, and daily is better if your system can do it.

You get an alert when the data goes stale:

  • A warning after 7 days without an upload.
  • A critical alert after 21 days.
  • A critical alert at any time when more than half of your households will expire within 7 days. A small upload does not hide a large base that is about to run out.

The alert reaches owners, admins and inventory managers. The fix is to upload a fresh file. Household Data shows how many households expire within 7 days. See Alerts for where alerts appear.

Upload by API

You can send the same rows from your own systems. A real upload must carry the confirmation, as the query parameter attestation=TERMS-4.4-2026-11-03 shown below. By sending it you give the same confirmation as the tick box on the page. A call without it is refused, and the version is kept with the upload. A check with dryRun=true needs no confirmation.

Create a key with Full access under account settings (see API keys). A "Reports only" key cannot upload.

POST /api/v1/operator-signals/ingest?attestation=TERMS-4.4-2026-11-03
POST /api/v1/operator-signals/ingest?dryRun=true

[{ "subscriberId": "SC-1001", "primaryLanguage": "hi", "arpuBand": "MID" },
 { "subscriberId": "SC-1002", "optedOut": true },
 { "subscriberId": "SC-1003", "remove": true }]

The key identifies your operator account, so you send no operator ID in the upload itself. dryRun=true checks and saves nothing. A call takes at most 50,000 rows and refuses a larger one with "At most 50000 households per call". The response carries the same counts as the page, and the call appears in Upload history as an API call.

If something goes wrong

What you seeWhat to do
"Confirm you have consent or another lawful basis for this data" (API)Add attestation=TERMS-4.4-2026-11-03 to the call. On the page, tick the confirmation.
Upload Signals is greyTick the confirmation under the file box. Also check that rows were detected and that your seat and account may upload.
"The file has no subscriberId column, so no row can be matched to a household."Add a subscriberId column to the header row.
The line under the box says "0 rows detected" and Validate stays offThe file has no readable rows. Check that columns are separated by commas and that rows follow the header.
"N rows left out, values that cannot be read"Fix the values listed. A number column holds a number, and a true or false column holds true, false, yes, no, 1 or 0.
Rejected: subscriberId looks like an email addressSend your subscriber number, not an email address.
Rejected: subscriberId may hold letters, digits and . _ : - onlyRemove spaces and other symbols from the ID.
Rejected: subscriberId is longer than 128 charactersUse a shorter ID.
Rejected: primaryViewerGender cannot be X (or another column name)Use one of the values in the table above.
Rejected: language must be an ISO 639-1 codeUse the two-letter code, for example hi, not hindi.
Rejected: subscriberId or householdId is requiredA row has an empty ID.
Rejected: could not be saved (reason "not saved")Upload the rows again. If it repeats, contact support.
"This operator account is not active yet."LtvAdx has not approved the account. See Account status.
"This operator account is suspended. Contact LtvAdx."Uploads are off while the account is suspended. Contact support.
"Your account is pending admin approval. You can keep exploring and setting up drafts, but this action is available once your account is approved."Your sign-up has not been approved yet. You cannot upload until it is.
"Your team role can view signals but not upload them"Ask an owner, admin or inventory manager.

Last reviewed 2026-11-03

Related guides

Contact support