[{"data":1,"prerenderedAt":770},["ShallowReactive",2],{"blog-replicate-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":23,"sources":30,"cover":61,"og":62,"expertise":63,"locales":64,"lang":65,"title":68,"description":69,"coverAlt":70,"metaTitle":71,"takeaways":72,"faq":78,"toc":91,"blocks":116,"others":497},"replicate","2026-05-22",10,"web",[9,10,11,12,13],"Model hosting","Serverless GPU","Diffusion","Async jobs","Webhooks",[15,16,17,18,19,20,21,22],"replicate api","replicate vs fal.ai","serverless gpu inference pricing","replicate webhooks","replicate cold start","replicate vs baseten","how to run an open source model in production","replicate prediction api",[24,27],{"name":25,"url":26},"Replicate","https:\u002F\u002Freplicate.com\u002Fdocs",{"name":28,"url":29},"Serverless computing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServerless_computing",[31,34,37,40,43,46,49,52,55,58],{"title":32,"url":33},"Replicate pricing","https:\u002F\u002Freplicate.com\u002Fpricing",{"title":35,"url":36},"Replicate docs: About predictions","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions",{"title":38,"url":39},"Replicate docs: Create a prediction","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Fcreate-a-prediction",{"title":41,"url":42},"Replicate docs: Prediction lifecycle","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Flifecycle",{"title":44,"url":45},"Replicate docs: Rate limits","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Frate-limits",{"title":47,"url":48},"Replicate docs: Data retention","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Fdata-retention",{"title":50,"url":51},"Replicate docs: Verify webhooks","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fwebhooks\u002Fverify-webhook",{"title":53,"url":54},"Replicate docs: Official models","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fmodels\u002Fofficial-models",{"title":56,"url":57},"fal.ai pricing","https:\u002F\u002Ffal.ai\u002Fpricing",{"title":59,"url":60},"Baseten pricing","https:\u002F\u002Fwww.baseten.co\u002Fpricing\u002F","\u002Fimages\u002Fblog\u002Freplicate\u002Fcover.webp","\u002Fimages\u002Fblog\u002Freplicate\u002Fog.jpg","ai-engineer",[65,66,67],"en","de","hu","Replicate, reviewed: a model API priced per second, with the sharp edges named","Replicate puts thousands of open models behind one prediction API and bills per second of compute. A review of cold boots, version churn and the one-hour data deletion.","A chute above a wide tray with three small squares at different heights, and a circle marking time.","Replicate, reviewed: per-second model hosting · Balázs Csorba",[73,74,75,76,77],"Replicate meters public models per second of hardware time and bills nothing while a shared model sits idle, which makes it cheap for bursty workloads and expensive for anything latency-sensitive.","Every run is a prediction object with a fixed set of statuses, and the difference between canceled and aborted decides whether you pay for the compute that ran.","Predictions created through the API are deleted an hour later, inputs and outputs included, so anything you need has to be copied out before then.","Only official models carry a stable input schema; community models are maintained by their authors and need a pinned version plus a test.","A deployment pins a version to hardware and an instance range, which removes cold boots and replaces them with a fixed hourly bill.",[79,82,85,88],{"q":80,"a":81},"What does Replicate actually charge for?","For models in the public catalogue, the price per second of the hardware the model runs on, starting at $0.000025 for a small CPU and reaching $0.001525 for an H100. Official models are the exception: they are billed per output image, per second of video or per token. Private models run on dedicated hardware, so you pay for setup and idle time as well as for the work.",{"q":83,"a":84},"Is Replicate cheaper than renting a GPU?","For spiky, low-duty-cycle work, yes, because you pay only while a prediction runs and shared capacity is reused between customers. For steady load above roughly a few percent utilisation, the arithmetic flips: a warm T4 instance on Replicate is $0.81 an hour, which is $583 for a 30-day month that never idles, and at that point a reserved instance on RunPod or Lambda is the cheaper contract.",{"q":86,"a":87},"Why does my Replicate prediction take minutes to start?","That is a cold boot. Replicate shuts down models that are not being used, and restarting one means loading several gigabytes of weights, which the documentation says can take several minutes. Official models are kept warm, and a deployment with min_instances set to 1 removes the wait for anything else.",{"q":89,"a":90},"Does Replicate keep my inputs and outputs?","Not for API predictions. Input parameters, output values, output files and logs are all removed an hour after the prediction is created, and the docs say you have to save your own copies. Predictions started from the web interface are kept indefinitely, which is worth knowing if the same model is used both ways.",[92,95,98,101,104,107,110,113],{"id":93,"title":94},"what-it-is","What Replicate actually is",{"id":96,"title":97},"how-it-works","How a prediction runs",{"id":99,"title":100},"getting-started","Getting started",{"id":102,"title":103},"pricing","What it costs",{"id":105,"title":106},"security-and-data","Data retention, tokens and webhooks",{"id":108,"title":109},"where-it-shingles","Where it hurts",{"id":111,"title":112},"verdict","Verdict",{"id":114,"title":115},"sources","Sources",[117,121,133,136,139,163,164,171,177,206,209,210,217,219,222,224,242,243,246,315,318,321,325,328,342,343,346,376,386,387,390,434,441,444,445,448,460,464,465],{"type":118,"content":119},"paragraph",[120],"Replicate is a hosted inference platform that puts thousands of open-weight and proprietary models behind a single prediction API, and it bills only for the seconds a machine spends running your request. The position here is plain: for a team that wants to try a new image or video model this afternoon without provisioning a GPU, it is the shortest path on the market. For a production endpoint with a latency budget and a predictable invoice, per-second billing is the wrong contract, and the platform only becomes defensible once a version is pinned and the model sits on a deployment.",{"type":118,"content":122},[123,124,128,129,132],"It sits between owning a GPU and buying from a model vendor. On one side it competes with ",{"tag":125,"href":57,"children":126},"a",[127],"fal.ai"," and ",{"tag":125,"href":60,"children":130},[131],"Baseten",", which sell inference rather than a catalogue; on the other it competes with renting a machine from a GPU broker and running your own container. What it does not replace is a token-billed LLM API. Replicate will happily serve a Llama model on an H100, but nobody prices a chat endpoint per second of GPU time.",{"type":134,"level":135,"id":93,"text":94},"heading",2,{"type":118,"content":137},[138],"Three things share one account and one API. First, a public catalogue of models published by their authors: fine-tunes, community implementations, research code. Second, a set of official models that Replicate maintains itself, which the documentation puts at over a hundred, and which are always warm, priced per output unit, and covered by a stable input schema. Third, private models that you package with Cog and run on dedicated hardware, where you pay for the whole life of the instance rather than for the work it does.",{"type":140,"ordered":141,"items":142},"list",false,[143,145,147,149,159,161],[144],"Every run is a prediction object with inputs, outputs, status, timing metrics and a cancel URL, whatever the model does.",[146],"Per-second billing on the published rates: $0.000025 for a small CPU, $0.000225 for a T4, $0.001400 for an A100 80GB, $0.001525 for an H100.",[148],"Official models bill per output instead: flux-1.1-pro at $0.04 per image, ideogram-v3-quality at $0.09, deepseek-r1 at $3.75 per million input tokens.",[150,154,155,158],{"tag":151,"children":152},"code",[153],"Asynchronous"," by default; synchronous when you send the ",{"tag":151,"children":156},[157],"Prefer: wait"," header, which holds the request open for 60 seconds.",[160],"Prepaid credit rather than a subscription. Credit is valid for one year from purchase and is not refundable.",[162],"Apache-2.0 clients for Node.js, Python, Swift and Go, plus a hosted MCP server at mcp.replicate.com that tracks the HTTP API.",{"type":134,"level":135,"id":96,"text":97},{"type":118,"content":165},[166,167,170],"Creating a prediction returns an object immediately with the status ",{"tag":151,"children":168},[169],"starting",", and that object stays the unit of work for the rest of the run. Three things then decide how long you wait: whether the model is warm, how long the model itself takes, and whether you poll, hold the HTTP connection, or wait for a webhook.",{"type":172,"src":173,"alt":174,"wide":175,"caption":176},"image","\u002Fimages\u002Fblog\u002Freplicate\u002Fdiagram-7.webp","The Replicate prediction lifecycle A prediction is created and moves from starting to processing. Processing ends in one of three terminal states: succeeded, canceled after a deadline expired while the model was running, or failed. A deadline that expires before the model starts ends it as aborted, which is not charged.",true,"A prediction is created, starts up, runs, and ends in one of four terminal states. The distinction that matters for cost is between canceled, which is billed for the time it ran, and aborted, which is not billed at all.",{"type":118,"content":178},[179,180,182,183,186,187,190,191,194,195,194,198,201,202,205],"The statuses are few and they carry the operational information. ",{"tag":151,"children":181},[169]," normally lasts well under a second; when it persists, it is a cold boot, and loading several gigabytes of weights can take minutes. ",{"tag":151,"children":184},[185],"processing"," is the model's own ",{"tag":151,"children":188},[189],"predict()"," method. Then one of ",{"tag":151,"children":192},[193],"succeeded",", ",{"tag":151,"children":196},[197],"failed",{"tag":151,"children":199},[200],"canceled"," or ",{"tag":151,"children":203},[204],"aborted"," ends the run, and the difference between the last two is whether the machine ever started.",{"type":118,"content":207},[208],"Predictions time out after 30 minutes, and a per-prediction deadline lets an application give up earlier. The billing rule follows the split exactly: a prediction aborted before it started is not charged, a canceled one is billed for the seconds it did run. That is a genuinely good design, and it is also the only reason a deadline is safe to set aggressively.",{"type":134,"level":135,"id":99,"text":100},{"type":118,"content":211},[212,213,216],"The Node.js client collapses the lifecycle into ",{"tag":151,"children":214},[215],"run()",". For a model that finishes in seconds, that is the entire integration and there is nothing else to write.",{"type":151,"code":218},"import Replicate from \"replicate\";\nimport { writeFile } from \"node:fs\u002Fpromises\";\n\n\u002F\u002F Reads REPLICATE_API_TOKEN from the environment.\nconst replicate = new Replicate();\n\nconst [image] = await replicate.run(\"black-forest-labs\u002Fflux-schnell\", {\n  input: {\n    prompt: \"An astronaut riding a rainbow unicorn, cinematic lighting\",\n  },\n});\n\nawait writeFile(\"output.png\", image);\nconsole.log(\"saved output.png\");",{"type":118,"content":220},[221],"Longer models need the asynchronous path, and a webhook is the only sane way to learn the outcome. Two details catch people out. The signature covers the raw request body, so verification has to run before any JSON parsing. And the client converts a byte body back into a string before you hand it to the HMAC, which would silently break every signature check.",{"type":151,"code":223},"import express from \"express\";\nimport Replicate from \"replicate\";\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nconst replicate = new Replicate();\nconst app = express();\n\n\u002F\u002F Verify first, parse second: the signature covers the raw body bytes.\napp.post(\"\u002Fwebhook\", express.raw({ type: \"application\u002Fjson\" }), (req, res) => {\n  const key = process.env.REPLICATE_WEBHOOK_KEY.replace(\"whsec_\", \"\");\n  const signed = `${req.headers[\"webhook-id\"]}.${req.headers[\"webhook-timestamp\"]}.${req.body}`;\n  const expected = createHmac(\"sha256\", key).update(signed).digest(\"base64\");\n  const seen = String(req.headers[\"webhook-signature\"]).split(\" \").map((p) => p.split(\",\")[1]);\n  const valid = seen.some((sig) => {\n    const a = Buffer.from(sig), b = Buffer.from(expected);\n    return a.length === b.length && timingSafeEqual(a, b);\n  });\n  if (!valid) return res.status(401).end();\n\n  const prediction = JSON.parse(String(req.body));\n  res.sendStatus(204); \u002F\u002F Replicate retries terminal webhooks on 4xx and 5xx.\n  console.log(prediction.id, prediction.status);\n});\n\napp.post(\"\u002Fimage\", async (req, res) => {\n  const prediction = await replicate.predictions.create({\n    model: \"black-forest-labs\u002Fflux-schnell\",\n    input: { prompt: req.body.prompt },\n    webhook: \"https:\u002F\u002Fexample.com\u002Fwebhook\",\n    webhook_events_filter: [\"completed\"],\n  });\n  res.json({ id: prediction.id });\n});",{"type":225,"variant":226,"title":227,"body":228},"callout","note","Holding the connection open is the cheapest integration and the worst one to build on",[229],[230,232,233,236,237,201,239,241],{"tag":151,"children":231},[157]," holds the request for 60 seconds by default and the header takes a value, so ",{"tag":151,"children":234},[235],"Prefer: wait=5"," gives a shorter budget. Past that the response comes back with the status still set to ",{"tag":151,"children":238},[169],{"tag":151,"children":240},[185]," and you are polling anyway.",{"type":134,"level":135,"id":102,"text":103},{"type":118,"content":244},[245],"The public catalogue meters compute by the second, and the rate belongs to the hardware rather than the model. The published table also converts each rate to an hourly figure, which is useful for comparison but is not what you are billed on. Setup time and idle time on shared capacity are free; only time spent processing is charged.",{"type":247,"head":248,"rows":257},"table",[249,251,253,255],[250],"Hardware",[252],"Per second",[254],"Per hour",[256],"Memory",[258,269,280,289,298,307],[259,263,265,267],[260],{"tag":151,"children":261},[262],"cpu-small",[264],"$0.000025",[266],"$0.09",[268],"2GB RAM, 1 vCPU",[270,274,276,278],[271],{"tag":151,"children":272},[273],"cpu",[275],"$0.000100",[277],"$0.36",[279],"8GB RAM, 4 vCPU",[281,283,285,287],[282],"Nvidia T4",[284],"$0.000225",[286],"$0.81",[288],"16GB VRAM",[290,292,294,296],[291],"Nvidia L40S",[293],"$0.000975",[295],"$3.51",[297],"48GB VRAM",[299,301,303,305],[300],"Nvidia A100 80GB",[302],"$0.001400",[304],"$5.04",[306],"80GB VRAM",[308,310,312,314],[309],"Nvidia H100",[311],"$0.001525",[313],"$5.49",[306],{"type":118,"content":316},[317],"Official models break the pattern, and that is where the bill becomes predictable. flux-1.1-pro is $0.04 per output image, flux-schnell is $3.00 per thousand images, ideogram-v3-quality is $0.09, and deepseek-r1 is priced per token. Any private model flips it back: it runs on dedicated hardware and you pay for setup, idle and active time alike, so an instance nobody calls all afternoon still costs money.",{"type":118,"content":319},[320],"Payment is prepaid. Credit is bought in advance, drawn down as you spend, valid for one year and non-refundable. When the balance reaches zero, running infrastructure is shut down and no new work starts. A prediction that overruns the balance is charged to the payment method at the end of the month. Auto-reload exists and the documented floor is a $5 threshold with a $15 reload, which is the cheapest guard against a queue of throttled requests.",{"type":134,"level":322,"id":323,"text":324},3,"deployments","Deployments and cold boots",{"type":118,"content":326},[327],"A deployment pins a model version to a hardware type and an instance range, and it answers both the cold-boot problem and the idle-cost problem at once. The price is explicit: a T4 kept warm at $0.81 an hour is $583 for a thirty-day month that never idles, against nothing at all for the same model called a hundred times a day on shared capacity. Deployment is the moment a Replicate bill stops being elastic and starts being a line item.",{"type":140,"ordered":141,"items":329},[330,332,338,340],[331],"Pin the version you tested. A new model version cannot then change your behaviour under load.",[333,334,337],"Set ",{"tag":151,"children":335},[336],"min_instances"," to one and the cold boot, including the multi-minute weight load, disappears.",[339],"Dedicated hardware means no queue shared with other users, at the price of paying for every idle hour.",[341],"The same split separates official models, which Replicate maintains and keeps warm, from community models, which their authors maintain and which may cold boot.",{"type":134,"level":135,"id":105,"text":106},{"type":118,"content":344},[345],"Everything sent through the API is transient by default. For predictions created through the API, the documentation states that input parameters, output values, output files and logs are all removed after an hour, and that you must save your own copies. Predictions created in the web interface are kept indefinitely. That asymmetry is the single most surprising operational fact in the docs, because the same model can sit under two very different retention regimes depending on which interface used it.",{"type":140,"ordered":141,"items":347},[348,354,356,368,374],[349,350,353],"API tokens are 40-character strings prefixed ",{"tag":151,"children":351},[352],"r8_",", passed as a bearer token, named per environment, and revocable individually from the account page.",[355],"Replicate scans public repositories for exposed tokens and disables compromised ones automatically, with an email explaining what happened. Convenient, and also a way for a false positive to stop production.",[357,358,194,361,128,364,367],"Webhooks carry ",{"tag":151,"children":359},[360],"webhook-id",{"tag":151,"children":362},[363],"webhook-timestamp",{"tag":151,"children":365},[366],"webhook-signature","; the signed content is the three joined by full stops and signed with HMAC-SHA256.",[369,370,373],"The signing secret comes from ",{"tag":151,"children":371},[372],"GET \u002Fv1\u002Fwebhooks\u002Fdefault\u002Fsecret"," and the docs recommend caching it rather than fetching it per delivery.",[375],"Limits are 600 prediction creations a minute and 3,000 requests a minute on every other endpoint, with a hard 429 body that names the reset window.",{"type":225,"variant":377,"title":378,"body":379},"warn","Make the webhook handler idempotent before anything else",[380],[381,382,385],"Terminal webhooks are retried on an exponential backoff with the final attempt about a minute after the prediction completed, and the docs state that identical webhooks can arrive more than once and that ordering is not guaranteed. A handler that assumes exactly-once will either lose jobs or double-count them. Key on ",{"tag":151,"children":383},[384],"prediction.id"," and ignore anything arriving after a terminal status.",{"type":134,"level":135,"id":108,"text":109},{"type":118,"content":388},[389],"The catalogue is the product, and the catalogue is the risk. A community model is a container published by a stranger: the input schema can change between versions, the author can disappear, and Replicate's own documentation says community models may have different levels of stability, documentation and support. Only official models carry a stable API, and pinning a version plus running it in a test is the minimum bar for anything a customer can see.",{"type":247,"head":391,"rows":397},[392,394,395,396],[393],"Dimension",[25],[127],[131],[398,407,416,425],[399,401,403,405],[400],"Billing unit",[402],"Per second of compute; official models per output",[404],"Per second, per image or per 1K tokens",[406],"Per 1M tokens, or per hour of GPU",[408,410,412,414],[409],"Catalogue",[411],"Thousands of community and official models",[413],"A small curated set of optimised models",[415],"Primarily models you deploy yourself",[417,419,421,423],[418],"Bring your own",[420],"Cog containers, public or private",[422],"Deployments on the fal GPU fleet",[424],"Dedicated deployments; VPC and self-host at the top tier",[426,428,430,432],[427],"Serverless GPU rate",[429],"No rental pool; per-second rates only",[431],"H100 from $2.49 an hour on custom deployments",[433],"Quoted per deployment",{"type":118,"content":435},[436,437,440],"The second problem is that the bill is never the bill finance expected. A model at $0.04 an image and a model at $5.49 an hour can both sit behind one careless loop, and the only per-run figure the API gives back is the ",{"tag":151,"children":438},[439],"metrics"," object on a single prediction, which nobody aggregates by default.",{"type":118,"content":442},[443],"Third, the client libraries are uneven. The Node.js client is at 1.4.0 and the Python client at 1.0.7, with a 2.0 line still in beta rather than released. A Python service that wants predictable behaviour should call the HTTP API directly instead of waiting, and the OpenAPI schema and the llms.txt endpoint make that painless.",{"type":134,"level":135,"id":111,"text":112},{"type":118,"content":446},[447],"Replicate is the best value available for one specific problem: running an open model without owning a GPU. It is a poor fit for anything else, and the reason is structural rather than a matter of maturity. Metered-by-second pricing optimises for the vendor's hardware utilisation, and your bill is the noise term in that optimisation.",{"type":140,"ordered":175,"items":449},[450,452,454,456,458],[451],"Teams prototyping a new image, video or speech model and needing an answer this week.",[453],"Teams willing to pin a version, hold the input schema stable and wrap the whole thing in a hard spend cap.",[455],"Anyone who wants breadth of models rather than a platform, and accepts that most of that catalogue is unmaintained.",[457],"Do not choose it for an interactive endpoint where tail latency is a product requirement, or for a steady load above a few percent utilisation, where a reserved GPU is simply cheaper.",[459],"Do not choose it when input files carry regulated personal data and a one-hour retention window does not clear your own policy.",{"type":225,"variant":226,"body":461},[462],[463],"The catalogue is a supermarket and a deployment is a lease on a machine. Deciding which one you are building on is most of the work, and the API will not make that decision for you.",{"type":134,"level":135,"id":114,"text":115},{"type":140,"ordered":175,"items":466},[467,470,473,476,479,482,485,488,491,494],[468],{"tag":125,"href":33,"children":469},[32],[471],{"tag":125,"href":36,"children":472},[35],[474],{"tag":125,"href":39,"children":475},[38],[477],{"tag":125,"href":42,"children":478},[41],[480],{"tag":125,"href":45,"children":481},[44],[483],{"tag":125,"href":48,"children":484},[47],[486],{"tag":125,"href":51,"children":487},[50],[489],{"tag":125,"href":54,"children":490},[53],[492],{"tag":125,"href":57,"children":493},[56],[495],{"tag":125,"href":60,"children":496},[59],[498,572,628,702],{"slug":499,"published":500,"minutes":6,"category":7,"tags":501,"keywords":507,"about":519,"sources":528,"cover":565,"og":566,"expertise":567,"locales":568,"lang":65,"title":569,"description":570,"coverAlt":571},"schema-org-structured-data-b2b-shop","2026-10-17",[502,503,504,505,506],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[508,509,510,511,512,513,514,515,516,517,518],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[520,522,525],{"name":502,"url":521},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":523,"url":524},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":526,"url":527},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[529,532,535,538,541,544,547,550,553,556,559,562],{"title":530,"url":531},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":533,"url":534},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":536,"url":537},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":539,"url":540},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":542,"url":543},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":545,"url":546},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":548,"url":549},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":551,"url":552},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":554,"url":555},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":557,"url":558},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":560,"url":561},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":563,"url":564},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg","b2b-ecommerce-developer",[65,66,67],"Schema.org structured data for B2B shops: prices behind logins, units and variants","Product markup for B2B shops: snippet or merchant listing, which price to publish, part numbers, unit pricing, variants, Organization and SSR in Nuxt.","A product rectangle with a framed outline and a small price slot hidden behind a low wall.",{"slug":573,"published":500,"minutes":574,"category":7,"tags":575,"keywords":580,"about":592,"sources":600,"cover":622,"og":623,"expertise":567,"locales":624,"lang":65,"title":625,"description":626,"coverAlt":627},"ai-assistant-b2b-shop-customer-support",9,[504,576,577,578,579],"AI assistant","Customer support","LLM agents","EU AI Act",[581,582,583,584,585,586,587,588,589,590,591],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[593,596,599],{"name":594,"url":595},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":597,"url":598},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":526,"url":527},[601,604,607,610,613,616,619],{"title":602,"url":603},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":605,"url":606},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":608,"url":609},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":611,"url":612},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":614,"url":615},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":617,"url":618},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":620,"url":621},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[65,66,67],"An AI assistant for B2B shop support: tools, permissions and the human handoff","How to build an AI support assistant for a B2B shop: which requests to automate, tools that run in the customer context, handoff, AI Act and metrics.","A tall wall with one narrow gap; an arrow passes through it into a boxed enclosure of three squares, and another leads down to a tray.",{"slug":629,"published":500,"minutes":630,"category":7,"tags":631,"keywords":636,"about":648,"sources":658,"cover":695,"og":696,"expertise":697,"locales":698,"lang":65,"title":699,"description":700,"coverAlt":701},"vue-ai-chat-ui-streaming-accessibility",11,[632,506,633,634,635],"Vue","Accessibility","Streaming","AI chat",[637,638,639,640,641,642,643,644,645,646,647],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[649,652,655],{"name":650,"url":651},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":653,"url":654},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":656,"url":657},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[659,662,665,668,671,674,677,680,683,686,689,692],{"title":660,"url":661},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":663,"url":664},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":666,"url":667},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":669,"url":670},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":672,"url":673},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":675,"url":676},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":678,"url":679},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":681,"url":682},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":684,"url":685},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":687,"url":688},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":690,"url":691},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":693,"url":694},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg","vue-nuxt-developer",[65,66,67],"Streaming AI chat in Vue and Nuxt: accessible by design","How to build a Vue or Nuxt AI chat UI: fetch streams, abort and retry, safe markdown rendering, aria-live announcements, keyboard support and reduced motion.","A message card with a careful caret, a dotted line opening into ripples and a check.",{"slug":703,"published":500,"minutes":574,"category":7,"tags":704,"keywords":709,"about":721,"sources":731,"cover":764,"og":765,"expertise":697,"locales":766,"lang":65,"title":767,"description":768,"coverAlt":769},"llm-translation-pipeline-i18n",[705,706,707,632,708],"Translation","i18n","LLM","Localization",[710,711,712,713,714,715,716,717,718,719,720],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[722,725,728],{"name":723,"url":724},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":726,"url":727},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":729,"url":730},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[732,734,737,740,743,746,749,752,755,758,761],{"title":733,"url":727},"Unicode ICU User Guide: Formatting Messages",{"title":735,"url":736},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":738,"url":739},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":741,"url":742},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":744,"url":745},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":747,"url":748},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":750,"url":751},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":753,"url":754},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":756,"url":757},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":759,"url":760},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":762,"url":763},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg",[65,66,67],"An LLM translation pipeline for i18n: glossary, placeholders and review","How to translate product and website strings with LLMs without breaking placeholders, plurals or tone: glossary, ICU messages, QA checks and review gates.","Three source cards, one translated card with a glossary ribbon, then a checked clipboard.",1792261156610]