Chinese Social Media Dataset Translator to English avatar

Chinese Social Media Dataset Translator to English

Pricing

from $2.80 / 1,000 translated rows

Go to Apify Store
Chinese Social Media Dataset Translator to English

Chinese Social Media Dataset Translator to English

Translate supplied Chinese social media datasets to English while preserving hashtags, mentions and emoji. Export pinyin and script variants with row status.

Pricing

from $2.80 / 1,000 translated rows

Rating

0.0

(0)

Developer

Tim Zinin

Tim Zinin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Translate supplied Chinese social-media exports while preserving source fields, protected text and per-row completion status.

Evidence status: private build 0.1.8 accepted on 2026-09-06. Every input/output example below is an exact dataset row or OUTPUT record from the accepted private acceptance runs on Apify's network with the pay-per-event tariff active. The listing is not public yet; no scheduled task or review history is claimed.

Buyer input to reviewed result

What you get

The Chinese Social Media Dataset Translator processes an export already supplied by the buyer. It translates selected text fields, preserves original columns, protects URLs, hashtags, mentions and emoji sequences, and optionally adds local pinyin and script conversion. It creates one Translated row only when every selected field and protected span passes validation. A batch with two complete rows and one damaged row keeps the two useful rows paid and the damaged row free.

No account login, platform scraping or page collection is included. A source object may come from a lawful purchased export, the buyer's own records or another authorized collection process. That provenance does not cause the Actor to revisit a source URL. The only model network operation is the compatible chat request; pinyin and simplified/traditional conversion run locally.

Who uses it

Cross-border research teams use it to make a supplied Chinese-text export readable for colleagues. Customer-experience teams use it to prepare review candidates from their own authorized feedback tables. Localization teams use pinyin and script views beside a translation for language review. Analysts can retain source IDs, timestamps and engagement columns while adding a distinct translated namespace rather than flattening everything into an untraceable English paragraph.

Use it when the source text already exists and its fields can be named explicitly. It is not a sentiment classifier, a social listening collector or an author identity service, and a complete structure can still hold an awkward translation: review a representative sample with someone who knows the source context.

Field preservation and selected paths

fields names up to twenty literal dotted paths. Every selected value must be a string. A row with a missing or nonstring selected field becomes a free error; a row whose selected strings are all blank is correct not-found without an LLM call. If a row contains both blank and nonblank selected fields, the nonblank fields are translated while the empty ones must remain exactly empty. Duplicate selectors are rejected before a paid request.

The output translated object uses the exact selected path strings as keys. Selecting post.caption produces translated["post.caption"], not a newly expanded translated.post.caption object. The original nested post object remains in the source payload. This makes the mapping deterministic and avoids guessing an output nesting scheme for a buyer's arbitrary source columns.

Names reserved by the Actor cannot overwrite processing status. If the input already contains translated, status, rowId, tokens or another reserved name, its original value is moved under original. Ordinary original columns remain at the top level. Secret-named properties are removed recursively and known credential echoes are scrubbed; this does not mean every original personal field is anonymized. Retain only data you have a reason and permission to process.

Protection, glossary and script views

Before translation, recognized URLs, hashtags, @mentions, emoji sequences and glossary terms are replaced with deterministic markers. The response must preserve each marker exactly once. Restoration returns protected spans to their original text, or to the explicitly mapped glossary value. Missing, duplicated or unknown markers invalidate that row. Full neighboring rows remain usable. The translator does not silently accept a missing hashtag as a successful translation.

Glossary entries map a source term to a desired output string. At most 100 nonempty pairs of at most 100 characters each are accepted. Longest overlapping glossary terms win, so a longer technical name can be distinguished from its shorter component. URLs and social tokens are protected as whole spans. Choose glossary terms deliberately, review overlap on a small sample and do not use a glossary as an executable replacement program.

Pinyin uses the locally pinned pinyin-pro package on original selected strings. Script conversion uses opencc-js: traditional converts from simplified Chinese toward the configured Taiwan form; simplified converts back toward simplified Chinese. These are views of the original text, not model translations of the English answer. With scriptMode:none, no script conversion is requested. Pinyin and orthographic conversion can require contextual review for names, polyphonic characters and regional terminology.

Language detection uses character-presence heuristics: Chinese characters, Latin letters, both, or undetermined. sourceLanguage is null when detection is off. Dialect markers are a small observed dictionary such as 咩, 唔, 嘅, 侬 and 啥 with provenance:heuristic and null confidence. They are not proof of an author's dialect, residence or identity. Avoid building audience segmentation from these markers alone.

Batching and allocated cost

batchSize is at most 10. Before every request the Actor shrinks the batch to fit the remaining result budget, row cap and input-unit allowance. Five complete translations are still five atomic result pushes. A batch is not a single billable unit. Responses are joined by their supplied rowId strings, so provider reordering does not corrupt the source join. Missing or duplicate IDs make the affected row incomplete; unexpected IDs make the batch response unsuitable for a trusted join.

Provider tokens and cost are measured per batch; per-row values are estimates allocated by the UTF-8 byte weight of the prepared fields, and integer allocation plus a final remainder preserves the batch totals. costAllocation and tokens.allocation name the estimate. Preserve batchId and the run ID when auditing sums.

requested and processed refer to source rows. The keyless cap permits at most twenty rows even when ten rows share one model call. The default is five synthetic rows with demo:true; every output from that designated demo, including free notices, retains the flag, and OUTPUT.demoInput is true. Supplying a Dataset ID bypasses demo prefill.

Commercial playbooks

Export-to-brief for an international team

Select the source text fields and retain source IDs and dates as original columns. Use a glossary for product names and internal terminology. Translate a representative sample, have a bilingual reviewer assess it, then process the approved remainder. Deliver the original Chinese, English candidate and status side by side. Keep partial rows in a review queue so a missing selected caption cannot be mistaken for an intentionally empty post.

Customer-feedback triage preparation

Use an authorized feedback export with a clearly defined purpose and limited personal data. Translate only the text required by the triage team, leaving operational IDs available for joins. Route complete rows into an internal review tool and failed rows to source correction. Do not automatically publish a reply or infer sentiment from the translation alone. The commercial output is a readable, traceable working table, with a separate human decision about customer action.

Localization terminology review

Prepare a glossary containing the approved spellings and run a small sample with hashtags, mentions, emoji and overlapping terms. Compare translated text with the local pinyin or script view where useful. If protected-span validation fails, inspect that row rather than accepting a lossy result. Build a reviewed glossary revision outside the Actor and retain its version in the buyer's job record before the next batch.

中文说明

中文社交媒体数据集翻译器只处理买家提供的导出数据,不访问抖音、小红书、微博等页面。选择 fields:["text"],保留原字段并增加 translated、拼音及简繁转换结果。话题标签、@提及、链接和表情通过占位符保护;损坏行免费,完整邻行可正常交付。默认五行是合成演示,每行有 demo:true,摘要含 demoInput:true。实际业务需确认数据使用权限并审阅翻译;演示不能替代真实导出数据的验收。

Automation workflow and downstream review

How to run

Begin with the small prefill and inspect both the Dataset and the OUTPUT record. The input form contains examples, but an example is not a credential or a promise that a provider account has access to a model. Keep maxConcurrency at 1. The default runtime allocation is 512 MiB with a 300-second timeout; the Actor stops admitting ordinary work after a 240-second deadline. A smaller workload is the right first check when changing a prompt, field selection, provider or language.

Omit apiKey to use the platform OpenRouter credential within the keyless limits, or enter a buyer credential in the secret input field with a compatible allowed endpoint and model. A nonempty buyer key is authoritative for that run; an authentication failure never silently switches the call to the platform account.

Start a run, wait for its final status, and inspect OUTPUT.fatal before downstream processing. Filter Dataset results using found === true, partial === false, resultCount === 1 and error === "". Keep free notices in a separate operational table. A successful process exit alone is insufficient to establish that every requested unit was completed. unprocessed, failed, partial and the Actor-specific counters explain what happened to the rest.

Pricing

The pricing is $0.005 per automatic run start plus $0.004 per Translated row, set on the platform tariff and read back from the accepted run receipts below. The result event is result-found. One complete Translated row causes one atomic SDK push with that event; the Actor never manually charges a start event.

The word “free” on this page refers to the result event. Errors, missing results, partial rows and operational summaries do not carry result-found, but the automatic start can already have been charged. A run with no complete result is therefore not necessarily a zero-dollar run. The planned arithmetic for 0, 1 and 2 complete results is $0.005, $0.009 and $0.013. These figures describe Actor event pricing; they do not include an independent invoice from a provider used with BYOK.

BYOK means the buyer supplies the LLM credential and pays that provider under their own account terms, in addition to Actor charges for complete results. Dataset costUsd describes upstream model cost, not the Actor event price. A provider-reported cost is distinguished from a tariff estimate. Unknown model pricing is left null when no usable cost was returned. Never add costUsd to Actor revenue or treat a model usage estimate as proof that an Apify event was charged.

Before expensive work the Actor checks how many results the buyer budget can cover, and before each paid push it reads the tariff and the remaining money again inside the serialized delivery section, in conservative microdollars. The final charged row remains delivered even if the SDK signals that the spending limit is now reached; the next unit is not admitted.

On the platform, missing or unreadable pricing, an unreadable balance, a non-PPE tariff or a paid automatic Dataset-item event fails the run without writing explanatory Dataset records: the explanation lives in the log and the failed status. An uncertain write or charge also stops processing, and deliveryUncertain requires reconciliation before a retry.

The platform credential has separate upstream admission limits: $0.03 per run, at most 20 completed result units, 20 logical LLM jobs and 40 HTTP attempts. These are ceilings; input size, the token reserve, retries, the work deadline or the buyer budget can stop a run earlier. BYOK removes the platform subsidy limits but retains the Actor's bounded input, token and work controls. Raising an input value above a hard cap is rejected instead of silently weakening the protection.

At the pinned DeepSeek Flash output rate of $0.18 per million tokens, the 768-token default reserves $0.00013824 for output alone (about $0.00014). Input, retries and any provider-reported excess are accounted for separately. The shared costEstimate uses the configured maxOutputTokens for every attempt; reasoning usage is not charged twice.

The cost admission estimate uses the dated tariff evidence recorded on 2026-09-06 for the two allowed flash models. Search additionally reserves an allowance for web work. An admission estimate cannot certify a universal upper bound on an external provider invoice: reasoning, search injection and changed upstream rates can affect actual usage. Reported usage above the reserve stops further work. Provider account limits remain a separate operational control, and local mock costs do not prove production margin.

Input contract

Inputs are JSON objects. Unknown top-level fields, invalid enum values, nonfinite numbers and wrong scalar types are rejected. Do not pass numeric strings where an integer is requested. The inline input is limited to 10 MiB of UTF-8 JSON. Opaque source rows have a 64 KiB limit, depth at most 8, at most 100 elements in each nested array and at most 200 properties in each object. These limits protect memory before prompt or batch expansion.

Where Dataset input is supported, reads use pages of at most 100 rows, with an aggregate limit of 5,000 rows and 10 MiB of retained row JSON. A working Dataset cap produces a partial summary with an omitted count rather than pretending the Dataset ended naturally. A failed Dataset read is an error, not an empty Dataset. The consumer is responsible for stabilizing the supplied Dataset during a run; pagination over a concurrently changing source is not a transactional snapshot.

Field selectors are literal dotted paths, up to 20 paths of 80 characters each. Duplicates are rejected. Property names such as __proto__, constructor and prototype are prohibited. Expressions, JavaScript functions and template evaluation are unsupported. Pass an already prepared field when a transformation needs arithmetic, complex filtering or application-specific access logic. This keeps the boundary between selecting data and executing code explicit.

The complete top-level form follows. prefill values are convenient small examples; defaults apply when a property is omitted. Conditional restrictions described here are also checked at runtime, including tighter platform limits than the maximum shown for BYOK. Secret fields intentionally have no example or prefilled credential.

rows — Supplied rows

Type: array. Default/sample: see the complete form prefill; sample only. Bounds: maxItems=500.

Inline buyer export, at most 500 objects. Prefill rows are explicitly synthetic demos. Dataset URLs and collection from social platforms are unsupported.

datasetId — Buyer dataset ID

Type: string. Default/sample: "omitted". Bounds: maxLength=17.

Optional 17-character dataset ID read through your SDK permissions. Omit the inline items/rows property entirely when using this field. No dataset URLs. Pages <=100; total <=5000 rows and 10 MiB.

fields — Text fields to translate

Type: array. Default/sample: ["text"]. Bounds: maxItems=20.

Every selected dotted path must be a string. One complete Translated row requires all selected fields and protected spans. No more than 20 paths.

targetLanguage — Target language

Type: string. Default/sample: "en". Bounds: maxLength=20.

Language code or short label passed to the model, such as en, zh or de. Validate suitability with your selected provider on representative data.

glossary — Protected glossary

Type: object. Default/sample: {}. Bounds: maxProperties=100.

At most 100 source-to-output mappings, each key and value <=100 characters. Longest source terms win. Protected spans are restored to the mapped value.

batchSize — Rows per LLM call

Type: integer. Default/sample: 5. Bounds: minimum=1, maximum=10.

At most 10. Batches shrink before requests to fit byte/token units and the number of rows the current buyer budget can cover.

includePinyin — Include source pinyin

Type: boolean. Default/sample: true.

Generate pinyin locally from the original Chinese text. Names, polyphonic characters and regional usage can need human review.

scriptMode — Source script conversion

Type: string. Default/sample: "traditional". Bounds: values: none, traditional, simplified.

Convert original source strings to traditional or simplified Chinese using OpenCC, or choose none. These fields describe source text, not the translated answer.

detectLanguage — Include language heuristics

Type: boolean. Default/sample: true.

Use visible script to label zh, en, zh+en or und. Dialect markers are explicitly heuristic with null confidence; no identity or origin inference.

maxItems — Maximum processed source rows

Type: integer. Default/sample: 5. Bounds: minimum=1, maximum=5000.

Count of source rows considered in this run, including free failures. Platform maximum 20; dataset ingestion independently caps at 5000 rows and 10 MiB.

apiKey — Buyer API key (optional)

Type: string. Secret; no example credential. Bounds: maxLength=512.

Optional buyer credential for the selected endpoint. Never copied to results. Empty uses the platform key only with OpenRouter. Buyer credentials are never replaced after a provider error.

baseUrl — OpenAI-compatible base URL

Type: string. Default/sample: "https://openrouter.ai/api/v1". Bounds: maxLength=300.

HTTPS base path, without /chat/completions. Only documented host/path pairs are accepted. Custom native endpoints require apiKey. Search supports OpenRouter only. No query, credentials, fragments or redirects.

model — Model ID

Type: string. Default/sample: "deepseek/deepseek-v4-flash". Bounds: maxLength=100.

Keyless: deepseek/deepseek-v4-flash or z-ai/glm-5.3-flash only. Qwen, Kimi and other model IDs require BYOK. The provider must support this model and operation.

reasoningMode — Thinking mode (OpenRouter)

Type: string. Default: off. Allowed values: off, low, provider (select editor).

Controls OpenRouter reasoning: off disables thinking where supported, low reduces effort, provider keeps provider defaults. Off uses low effort for z-ai/ models. Direct endpoints retain their own settings. See Thinking models and output tokens below for compatibility repeats and observed limits.

maxOutputTokens — Maximum completion tokens

Type: integer. Default/sample: 768. Bounds: minimum=1, maximum=4096.

Upper completion allowance per call, including reasoning tokens. Platform hard maximum 1024; BYOK hard maximum 4096. Lower this for small tasks. Length-truncated answers are free incomplete results.

maxTotalTokens — Run token-unit limit

Type: integer. Default/sample: 40000. Bounds: minimum=1, maximum=2000000.

UTF-8 message bytes plus completion reserve before each attempt, reconciled with valid usage afterward. Platform hard maximum 40000; BYOK 2000000. Unknown usage consumes full reserve.

temperature — Temperature

Type: number. Default/sample: 0.2. Bounds: minimum=0, maximum=2.

Sampling temperature passed to the provider. Repeated runs can differ even at a low value. Does not establish factual correctness.

maxConcurrency — Concurrent LLM calls

Type: integer. Default/sample: 1. Bounds: minimum=1, maximum=1.

Version 1 processes one call at a time. Billing and delivery are serialized. Schedule citation comparisons without overlapping runs.

Thinking models and output tokens

maxOutputTokens covers both visible output and provider reasoning tokens. OpenRouter receives reasoningMode: "off" by default as reasoning: {"enabled": false}. Models with the z-ai/ prefix reject that setting, so off uses {"effort": "low"} for them. low always requests {"effort": "low"}; provider omits the parameter and keeps provider defaults. On OpenRouter only, an HTTP 400 in off mode allows one compatibility repeat with effort: low, then one without reasoning if the repeat also returns 400. A third 400 is returned as an error. These repeats count in httpAttempts and reserve tokens and COGS under the existing deadline and run caps; they do not consume the separate allowance of two network retries. At most five requests can result from one task when both allowances are used.

Live checks on 2026-09-06 (three prompts per setting, max_tokens: 512, platform credential): with provider defaults DeepSeek v4 Flash spent up to 3435 tokens on reasoning and GLM 5.3 Flash returned null content with finish_reason: length in 3/3 cases; with off DeepSeek finished 3/3 with 0 reasoning tokens in 3–4 s and GLM finished 3/3 under effort: low. These are acceptance observations, not a guarantee for every prompt.

Direct provider endpoints receive no reasoning parameter, regardless of this input, and retain their own thinking settings; maxOutputTokens must cover those settings. A null content with finish_reason: length remains invalid_envelope; truncated string content remains incomplete_completion. Both are free error rows. reasoningTokens reports the provider's nonnegative integer usage.completion_tokens_details.reasoning_tokens, or null when absent or invalid. It is already part of tokensOut (the translator's tokens.output) and is never added again for cost or token admission.

Endpoint and model selection

Provider hostAccepted base pathRuntime requirement
openrouter.ai/api/v1Platform key or buyer OpenRouter key
api.deepseek.comempty path or /v1Buyer key; provider-native model ID
api.moonshot.cn/v1Buyer key; provider-native model ID
open.bigmodel.cn/api/paas/v4Buyer key and compatible chat model
dashscope.aliyuncs.com/compatible-mode/v1Buyer key and compatible chat model
dashscope-intl.aliyuncs.com/compatible-mode/v1Buyer key for the selected region
ark.cn-beijing.volces.com/api/v3Buyer key and supported deployment ID
api.minimax.io/v1Buyer key and compatible model
api.minimaxi.com/v1Buyer key and compatible model

The table is the transport allowlist, not a live certification of every model; /chat/completions is appended to the accepted base path. Native IDs differ from OpenRouter slugs, and copying a marketplace slug into a native endpoint does not translate it.

Keyless model IDs are exactly deepseek/deepseek-v4-flash and z-ai/glm-5.3-flash. Qwen, Kimi and other compatible model IDs require BYOK. :free, :online and other suffixes are not accepted; the translator adds no web search.

HTTPS and approved host/path combinations are required. Userinfo, query strings in the base URL, fragments, unapproved ports, path traversal and redirects are rejected. All resolved IP addresses must pass the public-address check, and the connection uses the verified address set. A public hostname that resolves to even one private address is refused. A redirect never carries the Authorization header to a new destination.

Field dictionary

Every Dataset record has the base fields below; operation-specific fields may be absent from a notice or a not-found row when no model call occurred. Do not infer zero tokens, zero cost or high confidence from a missing field.

FieldMeaning
rowIdString form of the zero-based source row index. A source field with the same name is retained under original.
textExample original buyer field. Actual nonreserved original columns depend on the supplied row and can contain authorized personal data.
originalNamespace containing original buyer fields that would collide with Actor-reserved output names. It preserves provenance without overwriting status.
translatedObject keyed by exact selected dotted paths, containing the translated strings. All selected fields must satisfy the row contract before payment.
pinyinPinyin generated locally from original selected text when enabled. It is not a model-provided translation or a dialect transcript.
traditionalLocal conversion of original selected text into traditional characters when requested. It does not translate the English output back into Chinese.
simplifiedLocal conversion of original selected text into simplified characters when requested. Empty object when another script mode is selected.
sourceLanguageHeuristic zh, en, zh+en or und based on character presence; null when detection is disabled. This is not a calibrated language classifier.
dialectMarkersObserved dictionary markers with heuristic provenance and null confidence. A marker is not a verified identification of a speaker or dialect.
tokensEstimated per-row allocation of the batch input/output usage. Integer allocations sum back to returned batch totals.
reasoningTokensNullable estimated per-row share of provider reasoning tokens; integer shares sum to the batch total and are already included in tokens.output. Uses the same UTF-8 input weights as tokens; null when unavailable.
costUsdUpstream cost in USD; provider value, dated estimate or null. This is distinct from the Actor result event price.
costSourceprovider, estimate or unknown. Check this before using a number in a cost comparison; null is not zero cost.
priceDateDate of the model tariff pin when cost is estimated; null for a provider-reported price. Distinct from the exchange-rate date.
costAllocationestimated_by_input_utf8_bytes. This makes explicit that the batch cost is allocated, rather than independently metered for this row.
batchIdRun-local batch label. Combine it with the run ID; batch-1 from separate runs is not a shared global identity.
modelNormalized provider model identifier used for this request. Keep it with the prompt or field configuration when comparing results.
providerSelected API host. It identifies the transport provider rather than an independent verification service.
demoTrue on every output row for designated synthetic demo input. Keep it in exports so synthetic material cannot masquerade as buyer data.
schemaVersionContract version, currently 1.0. Preserve it when loading historical runs; a version is not a freshness timestamp.
typeRecord kind: the product result type, notice, or domain_summary. Filter by kind before interpreting operation-specific fields.
sourceUrlThe API endpoint used for provider evidence, or null when no call was needed. This is not a dereferenced social source URL.
foundTrue only for a complete useful product unit. False includes both correct absence and failure; inspect status and error.
statusMachine-readable outcome such as ok, not_found, error, partial, no_citations or summary. The appropriate subset depends on record kind.
resultCountExactly 1 for a complete result and 0 for free explanatory records. It never reports an estimated number of unseen answers.
partialTrue when this record is incomplete or describes unfinished work. Complete neighboring records can remain false in a partial run.
errorEmpty string for correct absence or a complete result. Nonempty generic code for a failure; credentials and provider error bodies are not copied.
warningsAdditional interpretation limits or a cap reason. Warnings are data, not instructions for a downstream agent to execute.
checkedAtUTC observation timestamp generated during processing. It does not claim when the underlying text was originally published.
evidenceOperation-specific provenance object or null. It identifies how the row was produced and does not certify factual accuracy.
confidenceNull unless a supported confidence measure exists. Version 1 does not invent a probability for model output or dictionary classifications.
actionSuggested mechanical route such as use_result, review, review_or_retry, resume_remaining or review_grounding. Your application decides the final action.

Run summary in OUTPUT

FieldMeaning and consumer action
requestedWork supplied before the Actor's working cap; interpretation follows the product's unit below.
processedUnits attempted or classified, including failures and correct absence. It is not a billable count.
deliveredComplete useful units whose Dataset delivery was confirmed. Free notices are counted separately.
paidConfirmed result-found units under the active PPE tariff. Local nonmonetized execution can deliver without this count.
freeConfirmed Dataset records written without a result event, including summaries and notices.
failedFree records with a nonempty error. A correct not-found record does not increase this counter.
unprocessedRequested units left outside completed processing because of a work, input, money or delivery stop.
partialAt least part of the requested work is incomplete, erroneous or uncertain. Successful neighbors remain useful.
fatalEmpty string normally; nonempty means the run must be treated as failed even if some useful rows exist.
deliveryUncertainCount of delivery attempts whose outcome could not be confirmed. Stop automatic replay.
budgetExhaustedFurther paid work was refused by the buyer spending gate. It does not invalidate the final paid unit.
replaySafeAlways false in v1. The Actor has no cross-run exactly-once ledger.
reason / stopReasonDomain-level stop and client-level stop, respectively; preserve both for troubleshooting.
logicalTasks / httpAttemptsAdmitted LLM tasks and actual request attempts, which can differ because of retries.
tokenUnitsConservative attempt reserves reconciled with valid returned usage. This is a guard counter, not a universal tokenizer.
costBoundUsdAccumulated admission estimates, increased when a provider reports a larger known cost.
reportedUpstreamCostUsdSum of provider cost values actually returned, including unsuccessful completion envelopes.
unknownCostAttemptsAttempts without an authoritative cost value. It prevents a null invoice from looking free.
demoInputWhether the Actor used designated synthetic source data; see the product-specific convention.
checkedAt / schemaVersionObservation timestamp and output contract version. Retain both in exports.

Evidence and boundaries

This README is backed by accepted platform runs on Apify's network (build 0.1.8, 2026-09-06): happy EngTjbCehl9U9G7na, not-found H15cOP0MHJuZxOPpA, keyless cap PJX2qDbdiprjTvdWv, plus the token-limit golden; all four acceptance goldens passed and the charged event counts below were read back from the run records. Local SDK 3.7.2 tests with a mock OpenAI-compatible server (tests/, proofs/) cover the failure paths that are not reproduced on the platform on purpose.

Real buyer exports were accepted as well: Douyin run OBBXabez7skFgfcTL and Xiaohongshu run KIdHkKOos9vyRW0d7, ten paid rows each on exports bought in the Apify Store; both are recorded below.

The two diagrams are the Actor's own 1600×900 illustrations, not screenshots of a listing.

Transport is bounded to 2 MiB per LLM/FX response and 50 MiB of response data per run. The LLM request has a 45-second DNS, connection and body timeout; FX uses 20 seconds. Network failures, HTTP 429 and 5xx responses allow at most two network retries per task, with Retry-After constrained by the run deadline. OpenRouter off-mode HTTP 400 compatibility repeats are separately bounded as described in Thinking models and output tokens. A platform-key 402, 403 or 429 stops after the first attempt and returns a BYOK hint. Malformed JSON, HTML, redirects, HTTP 401 and incomplete response bodies are not retried. HTTP 400 is terminal outside the bounded OpenRouter off-mode compatibility path.

Text and URLs supplied by the buyer are data. The Actor does not execute scripts, download attachments, render web pages or follow citation links. It makes no direct requests to Douyin, Xiaohongshu, Weibo, Zhihu, WeChat, Bilibili, Baidu, Taobao, 1688, JD, Toutiao, Juejin or 36kr. Their names or URLs can occur in source rows and annotations without authorizing collection from them. Search providers perform their own upstream retrieval; excluded-domain settings do not establish independent control over every internal provider request.

Two provider behaviours seen on the accepted runs are handled in code and covered by tests: with reasoning disabled, deepseek/deepseek-v4-flash sometimes echoes the input container key instead of translated, so the parser accepts the translation under either key as long as the field names and rowId match; and long fields can overflow the output budget of a batch, so batches are sized from an estimate of the output tokens (1.6 tokens per character) and a batch that still comes back truncated is halved and retried from the same row, which is why a paid batch never hides a truncated row.

Decision routing

ObservationRoutePreserve before proceeding
Complete result, no fatal errorSend to the product's human or automated review stepSource identity, model, settings, timestamp and evidence fields
found:false, empty error, zero result countClassify the defined absence; do not invent a completionOriginal selection and the not-found status
Free error next to complete resultsKeep successful neighbors; isolate failed unitsError code, input index or row ID, run ID
unprocessed > 0Prepare a smaller remaining-work batchOriginal ordering, delivered identities and cap reason
fatal or uncertain deliveryStop automatic replay and reconcileRun receipt, Dataset contents and the OUTPUT record

Integration recipes

For a spreadsheet, export complete results and free notices into separate sheets and keep the raw JSON next to flattened columns: nested translations and original-field collisions do not fit one scalar cell. Count useful results from the base status contract, not from the number of visible lines.

For an API or scheduled workflow, keep the run ID, wait for the terminal status, then read both the Dataset and the KVS OUTPUT. A timeout in your orchestration does not prove the Actor failed; recover the saved run ID before resubmitting a whole job. Workflow tools or MCP clients can pass the same JSON contract and route complete rows into a CRM, warehouse or review queue; the Actor itself writes to none of them.

const usable = datasetRows.filter(row =>
row.found === true && row.partial === false &&
row.resultCount === 1 && row.error === '');
const reconcile = Boolean(output.fatal) || output.deliveryUncertain > 0;
const remaining = output.unprocessed > 0;

Operating guide

Before increasing volume, run a representative sample with empty text, mixed languages, long rows, nested fields and protected terms, define the review criterion in advance and change one setting at a time. A model, prompt or glossary revision can change meaning while structural tests still pass. Keep configuration versions separate from credentials.

During a run the token guard reserves UTF-8 message bytes plus an output reserve before each attempt and reconciles valid provider usage afterwards; unknown usage keeps the reserve debited, so an unsuccessful call cannot bypass the cap. A retry can cost upstream money without producing a billable Actor result.

After partial work, distinguish a deterministic correction from a transient failure. Invalid input requires editing the input. A schema incompatibility requires fixing the schema or choosing a supporting model. A budget or token stop requires a smaller remaining workload or an intentionally authorized limit change. Authentication errors require checking the chosen account. Repeating the same invalid configuration adds no useful evidence and may incur another automatic start.

Results and named baseline storage belong to the buyer's Apify storage context. Configure retention and access in that account and downstream systems; the Actor does not impose a calendar-based deletion policy. Send only source material needed for the task. The buyer is responsible for rights to process supplied data and for evaluating applicable PIPL/GDPR duties, provider terms and cross-border processing requirements. This workflow description is not legal advice or a compliance certification. The Actor does not log source payloads, phone numbers or identity records; errors use generic codes and known credentials are scrubbed from persisted results.

FAQ

Does complete mean accurate? Completion means the provider finished in the required form and mechanical checks passed. Schema validation constrains structure, while factual and linguistic review remain separate decisions.

Can a run finish without a paid result? Yes. Correct absence, validation failure, a missing key, a provider error or an admission limit can yield no result-found event. Free records can still make the Dataset nonempty, and the automatic start may still apply.

Can I use any model or endpoint? Keyless runs accept only the two reviewed flash IDs. BYOK permits compatible model IDs on the listed host/path pairs. A valid identifier is not proof of account access or feature support. Arbitrary proxies and private endpoints are not accepted.

Is the evidence on this page live? The examples are exact records from accepted runs on Apify's network, including two bought Douyin and Xiaohongshu exports; URLs inside rows are retained as strings and are not verified by the Actor.

Sources and rights

Provider interface references are OpenRouter web search documentation and usage accounting documentation. They are interface references, not a claim that every allowed provider was called in this build. SDK behavior was checked against the installed, exactly pinned Apify 3.7.2 package. Applicable FX rows retain their own route and observation date.

The Actor grants no ownership of source texts, trademarks, linked publications or provider outputs. Obtain data through sources you are authorized to use. Access to an export does not automatically establish a right to republish it. Keep provenance and any source restrictions with shared reports, particularly when results cross customer or organization boundaries.

Recorded happy, not-found and partial output (accepted platform runs)

The three examples below are exact records from the accepted acceptance runs listed in Evidence and boundaries; strings longer than the page limit are cut with an explicit truncation note, nothing else is edited. Only checkedAt and provider latency differ between repeated runs.

happy — paid result-found row

Run EngTjbCehl9U9G7na on build 0.1.8, 2026-09-06, 3 s, Dataset records: 1, charged events: {"apify-actor-start": 1, "result-found": 1}.

Input:

{
"rows": [
{
"text": "你好 #科技",
"demo": true
}
],
"maxItems": 1,
"targetLanguage": "en",
"glossary": {},
"batchSize": 5,
"includePinyin": true,
"scriptMode": "traditional",
"detectLanguage": true,
"baseUrl": "https://openrouter.ai/api/v1",
"model": "deepseek/deepseek-v4-flash",
"reasoningMode": "off",
"maxOutputTokens": 768,
"maxTotalTokens": 40000,
"temperature": 0.2,
"maxConcurrency": 1
}

First Dataset record (exact):

{
"schemaVersion": "1.0",
"type": "translated_row",
"sourceUrl": "https://openrouter.ai/api/v1/chat/completions",
"found": true,
"status": "ok",
"resultCount": 1,
"partial": false,
"error": "",
"warnings": [],
"checkedAt": "2026-09-06T01:39:35.178Z",
"evidence": {
"kind": "supplied_data_translation",
"fields": [
"text"
]
},
"confidence": null,
"action": "use_result",
"reasoningTokens": 0,
"text": "你好 #科技",
"original": {
"demo": true
},
"rowId": "0",
"demo": true,
"translated": {
"text": "Hello #科技"
},
"pinyin": {
"text": "nǐ hǎo # kē jì"
},
"traditional": {
"text": "你好 #科技"
},
"simplified": {},
"sourceLanguage": "zh",
"dialectMarkers": [],
"tokens": {
"input": 131,
"output": 31,
"allocation": "estimated"
},
"costUsd": 3.75e-05,
"costSource": "provider",
"priceDate": null,
"costAllocation": "estimated_by_input_utf8_bytes",
"batchId": "batch-1",
"model": "deepseek/deepseek-v4-flash",
"provider": "openrouter.ai"
}

OUTPUT record (run summary):

{
"requested": 1,
"processed": 1,
"unprocessed": 0,
"partial": false,
"reason": "",
"demoInput": true,
"logicalTasks": 1,
"httpAttempts": 1,
"tokenUnits": 162,
"costBoundUsd": 0.000175875,
"reportedUpstreamCostUsd": 3.75e-05,
"unknownCostAttempts": 0,
"stopReason": "",
"delivered": 1,
"paid": 1,
"free": 0,
"failed": 0,
"fatal": "",
"deliveryUncertain": 0,
"budgetExhausted": false,
"replaySafe": false,
"replayNote": "Serialize schedules. No exactly-once ledger; reconcile uncertain delivery before replay.",
"schemaVersion": "1.0",
"checkedAt": "2026-09-06T01:39:35.275Z"
}

not-found — free row, no result charge

Run H15cOP0MHJuZxOPpA on build 0.1.8, 2026-09-06, 3 s, Dataset records: 1, charged events: {"apify-actor-start": 1, "result-found": 0}.

Input:

{
"rows": [
{
"text": ""
}
],
"maxItems": 1,
"targetLanguage": "en",
"glossary": {},
"batchSize": 5,
"includePinyin": true,
"scriptMode": "traditional",
"detectLanguage": true,
"baseUrl": "https://openrouter.ai/api/v1",
"model": "deepseek/deepseek-v4-flash",
"reasoningMode": "off",
"maxOutputTokens": 768,
"maxTotalTokens": 40000,
"temperature": 0.2,
"maxConcurrency": 1
}

Dataset record (exact):

{
"schemaVersion": "1.0",
"type": "translated_row",
"sourceUrl": null,
"found": false,
"status": "not_found",
"resultCount": 0,
"partial": false,
"error": "",
"warnings": [],
"checkedAt": "2026-09-06T01:39:38.687Z",
"evidence": null,
"confidence": null,
"action": "review",
"reasoningTokens": null,
"text": "",
"rowId": "0",
"demo": false
}

partial — keyless cap reached, the extra row is never charged

Run PJX2qDbdiprjTvdWv on build 0.1.8, 2026-09-06, 8 s, Dataset records: 21, charged events: {"apify-actor-start": 1, "result-found": 20}.

Input:

{
"rows": [
{
"text": "中文 0"
},
{
"text": "中文 1"
},
"… 19 more rows of the same shape omitted here for length"
],
"maxItems": 21,
"batchSize": 10,
"targetLanguage": "en",
"glossary": {},
"includePinyin": true,
"scriptMode": "traditional",
"detectLanguage": true,
"baseUrl": "https://openrouter.ai/api/v1",
"model": "deepseek/deepseek-v4-flash",
"reasoningMode": "off",
"maxOutputTokens": 768,
"maxTotalTokens": 40000,
"temperature": 0.2,
"maxConcurrency": 1
}

Free notice record (exact):

{
"schemaVersion": "1.0",
"type": "notice",
"sourceUrl": null,
"found": false,
"status": "partial",
"resultCount": 0,
"partial": true,
"error": "",
"warnings": [
"working_cap"
],
"checkedAt": "2026-09-06T01:39:52.143Z",
"evidence": null,
"confidence": null,
"action": "review",
"reasoningTokens": null,
"unprocessed": 1,
"demo": false
}

supplied dataset — real Douyin search export (paid rows)

Run OBBXabez7skFgfcTL on build 0.1.7, 2026-09-06, 36 s, Dataset records: 11, charged events: {"apify-actor-start": 1, "result-found": 10} — 10 paid rows out of 10 requested. The dataset was an export bought in the Apify Store and passed through datasetId; the actor never contacted the social platform.

Input:

{
"datasetId": "LbXVpVXC2wamns1mw",
"fields": [
"text",
"caption"
],
"targetLanguage": "en",
"batchSize": 5,
"includePinyin": true,
"scriptMode": "traditional",
"detectLanguage": true,
"maxItems": 10,
"maxConcurrency": 1,
"glossary": {},
"baseUrl": "https://openrouter.ai/api/v1",
"model": "deepseek/deepseek-v4-flash",
"reasoningMode": "off",
"maxOutputTokens": 768,
"maxTotalTokens": 40000,
"temperature": 0.2
}

First paid Dataset record, reduced to the source fields, the translation, the language heuristic and the token/cost accounting (pinyin and script views are omitted here as well; 71 pass-through fields of the original export such as action, aiMetadata, anchors, authorMeta, awemeType, awemeTypeLabel … are omitted here for length; the actual record carries every original field unchanged):

{
"text": "电车真的要淘汰燃油车了吗? 别被网络洗脑了,今天一条视频告诉你到底是选电车还是选燃油车!#燃油车 #电车 #汽车知识分享 #青年创作者成长计划",
"caption": "别被网络洗脑了,今天一条视频告诉你到底是选电车还是选燃油车!#燃油车 #电车 #汽车知识分享 #青年创作者成长计划",
"rowId": "0",
"found": true,
"status": "ok",
"partial": false,
"error": "",
"sourceLanguage": "zh",
"translated": {
"text": "Will electric cars really replace fuel vehicles? Don't be brainwashed by the internet. Today, a video tells you whether to choose an electri… [truncated here for length; the record holds 188 characters]",
"caption": "Don't be brainwashed by the internet. Today, a video tells you whether to choose an electric car or a fuel car! #燃油车 #电车 #汽车知识分享 #青年创作者成长计划"
},
"tokens": {
"input": 271,
"output": 207,
"allocation": "estimated"
},
"reasoningTokens": 0,
"costUsd": 9.179e-05,
"model": "deepseek/deepseek-v4-flash"
}

supplied dataset — real Xiaohongshu search export (paid rows)

Run KIdHkKOos9vyRW0d7 on build 0.1.8, 2026-09-06, 21 s, Dataset records: 11, charged events: {"apify-actor-start": 1, "result-found": 10} — 10 paid rows out of 10 requested. The dataset was an export bought in the Apify Store and passed through datasetId; the actor never contacted the social platform.

Input: the same shape as the Douyin example with datasetId: "a2dg49fnBbqJfj8Mn", fields: ["title", "desc"] and scriptMode: "traditional".

First paid Dataset record, reduced to the source fields, the translation, the language heuristic and the token/cost accounting (pinyin and script views are omitted here as well; 33 pass-through fields of the original export such as action, at_user_list, author, click_score, confidence, costAllocation … are omitted here for length; the actual record carries every original field unchanged):

{
"title": "9月,Model 3:19.97w起",
"desc": "⚡️是谁还没有Get一辆梦中情车呀? 🙋赶紧跟着小金教你怎么提划算! 🚗裸车价:22.75w(含8k保险补",
"rowId": "0",
"found": true,
"status": "ok",
"partial": false,
"error": "",
"sourceLanguage": "zh+en",
"translated": {
"title": "In September, Model 3: starting from 197,900 yuan",
"desc": "⚡️Who hasn't gotten a dream car yet? 🙋Follow Xiao Jin to learn how to get the best deal! 🚗Naked car price: 227,500 yuan (including 8,000 yua… [truncated here for length; the record holds 160 characters]"
},
"tokens": {
"input": 114,
"output": 94,
"allocation": "estimated"
},
"reasoningTokens": 0,
"costUsd": 4.080147727272727e-05,
"model": "deepseek/deepseek-v4-flash"
}

Related tools for adjacent workflows in data pipelines for AI applications, social platforms and regional directories.

ActorWhat it does
RAG Dataset BuilderPair it in the data pipelines for AI applications workflow: Turn buyer-authorized public website sitemaps into bounded, source-linked text chunks for RAG, search,...
Live Price OraclePair it in the data pipelines for AI applications workflow: Get timestamped DexScreener market observations for up to 100 token contracts or bounded ticker searches
Structured Data ExtractorPair it in the data pipelines for AI applications workflow: Extract title, meta, JSON-LD, headings, links, emails, and price observations from up to 100 authorized...
Telegram Export IntelligencePair it in the social platforms and regional directories workflow: Turn owner-authorized Telegram message exports into per-post reach context, evidence, confidence, review...
URL to Markdown ConverterPair it in the data pipelines for AI applications workflow: Convert up to 100 authorized public HTML pages into clean Markdown for RAG, AI agents, SEO research, and...