RSS Watch ger feedvisning, kategorigruppering, valfria AI-sammanfattningar och ett fullständigt REST-API för scraper-workers och klientapplikationer.
RSS Watch är både en publik feedläsare och en backend-pipeline för inläsning. De publika sidorna (/feed, kategorivyer och entry-sidor) är för läsare, medan scraper-workers och trigger-jobb hämtar konfigurerade källor och postar normaliserade payloads till Tools för vidare bearbetning.
RSS Watch-workers identifierar sig som bottrafik och inkluderar en dokumentations-URL i User-Agent.
Mozilla/5.0 (compatible; RSSWatchBot; +https://tools.tornevall.net/docs/rsswatch; runner=scrape; host=<agent-hostname>)Mozilla/5.0 (compatible; RSSWatchBot; +https://tools.tornevall.net/docs/rsswatch; runner=trigger; host=<agent-hostname>)Driftnotering: schemaläggnings-/agentrapportering nycklas fortfarande på agent_id (hostname) i API-anrop; ändrad User-Agent-text ändrar inte agentattribueringen.
Scrape-workers skriver nu också tidsstämplade körloggar. Scrapern försöker i första hand använda SCRAPE_LOG_FILE, därefter /var/log/tools-scraper/scrape.log, och annars lokala fallback-sökvägar i scraperprojektet när de är skrivbara.
/feed/feed för att söka i titlar, beskrivningar, innehåll, sajtnamn och kategorier utan att lämna sidan/feed-admin (query per_page kan fortfarande överstyra per anrop)/feed-sidan blir lättare att skanna utan att textläsbarheten försämras/feed/c/{categorySlug} (med samma versions-/diffvisning som vanliga feedsidor)/feed/cards/{categorySlug} för en mer kortbaserad analysöversikthistory=1, history_limit)./feed, /feed/c/{categorySlug} och /feed/cards/{categorySlug} skriver nu om råkade localhost-/loopback-URL:er till den aktiva publika hosten innan de renderas./artiklar/foo) mot feedens real_url/url, så att både /out/{contentId} och de synliga källänkarna blir fullt kvalificerade.publishby-värde (till exempel ett numeriskt ID) och en operatör lagt in en manuell mappning för just den feeden./feed utan får i stället en hash-baserad direkt-URL, till exempel /feed/key/{public-hash} och /api/rss/feed/{public-hash}/api/rss/feed/{selector}:
analytics-daily (alias daily-analytics)analytics-weekly (alias weekly-analytics)analytics-monthly (alias monthly-analytics)analytics-yearly (alias yearly-analytics)analytics-bulk (alias bulk-analytics, kombinerar daily/weekly/monthly/yearly)/api/rss/feed/{category-slug} för kategori-analytics och /feed/{site-urlid} för site-analytics)/feed har nu ett mini-kort Ask about all open feeds där besökare kan ställa fria frågor mot den öppna RSS-datan/feed visar nu också en tydlig support-/kontaktsektion intill disclaimers, med både länk till den vanliga kontaktsidan och direktadressen support@tornevall.net för frågor, klagomål, rättelser eller feedrelaterade problemPOST /feed/user-questionsGET /feed/user-questionssabah) inte lika lätt försvinner ur retrievalen.user_id eller gäst), IP, user-agent, status, svar/fel och svarsmetadata för audit/historik/feed är nu AJAX-först och visar svar/fel inline; vanlig form post/redirect finns kvar som fallback utan JavaScript/feed och i site-specifika feedpaneler använder nu ett tvåstegsflöde för bättre återkoppling:
POST /feed/user-questions med start_only=1 reserverar frågeraden och returnerar en kortlivad klienttoken samt progress-URL:erPOST /feed/user-questions/{question}/process kör själva analysen i bakgrundsanropetGET /feed/user-questions/{question}/status låter webbläsaren poll:a aktuell fas/progress tills svaret är klart/status-förfrågningar. Fastnade poll-anrop avbryts efter en kort timeout, webbläsaren backar av när sidan ligger i bakgrunden, och progressuppdateringen återupptas rent när fliken blir aktiv igen.process redan hinner bli färdigt med slutsvaret tar webbläsaren nu det svaret direkt i stället för att fortsätta skicka extra /status-pollning tills nästa timerhugg.content.publishby innan bredare keyword-fallback.publishby-värden i stället för riktiga namn använder Feed Q&A nu också de per-feed manuella publishby-mappningarna från RSS-editorn, så att sådana frågor fortfarande kan hitta rätt skribent.publishby saknas eller är inkonsekvent./feed nu dessa uttryck i en readonly-hjälpruta under senaste svaret, så läsaren ser vad som också användes för att hitta mer material före svaret./feed och den site-specifika frågepanelen för en feed visar nu också en separat readonly-ruta med sökord som användes, så läsaren kan se de bokstavliga querybara termer/fråser som backenden faktiskt sökte efter innan eventuella bredare extratermer användes./feed stöder nu följdfrågor: användaren kan välja ett tidigare färdigt svar som följdfrågekontext, och backenden återanvänder tidigare retrieval-termer samt tidigare svarskontext när frågan ska fördjupas.use_web_search) så RSS-svar kan köras med web_search-baserad verifiering när den är påslagen./feed och i site-specifika feedpaneler visar nu också om webbsökning faktiskt användes för just det svaret och listar, när de finns, de källänkar/citations som returnerades.Tara Sabah / Tara Saleh i stället för konstiga hjälputtryck som tara sabah artiklar eller tara saleh källor.strict, balanced, expansive) både på /feed och i site-specifika frågepaneler.daily/weekly/monthly/yearly/all_time), tillåtna kategorier, tillåtna sajter, context-cap för antal poster, max antal meningar i svaret, standardsökordsbredd och antal minihistorikrader på /feed/feed visar nu också en liten inline-historik över de senaste färdiga frågorna direkt i frågekortet/feed/user-questions har nu paginering med valbart antal rader per sida för att hantera spammig historik bättre/feed/user-questions via AJAX (vanlig redirect-fallback fungerar fortsatt utan JavaScript)/feed/user-questions och i /feed-admin innehåller nu även val av svarsmodell och tonalitet för OpenAI-svarstatus, user_id (eller guest), ip och deleted-scope (active/deleted/all)hard delete tar bort raden permanentsoft delete sparar raden med raderingsmetadata (deleted_at, deleted_by_user_id, deleted_reason)POST /feed/user-questions/{question}/restore) för undo-flöde.daily, weekly, monthly eller yearly.content via träffar i title/description/content, och först därefter byggs kontext-/versionsblock från relevanta rader.matched_entries-lager, så konkreta utdrag från title, description, content, publishby, feed_title och artikellänkar fortfarande finns kvar när slutsvaret skrivs.anders sydborg) före lösare stödsökord, vilket minskar falska träffar från breda förstnamnssökningar.har, du, något, spännande, med, with, about, something och liknande filtreras nu bort även när de råkar finnas kvar i OpenAI-svaret eller i den deterministiska fallbacken.daily, weekly, monthly) tillåter högre träfftak än yearly och all_time, så specifika korttidsfrågor kan få mer underlag utan att promptstorleken skenar.5 pass och är admin-konfigurerbart; om taket nås går systemet ändå vidare till slutanalysen med bästa hittills insamlade underlag./feed/user-questions visar nu en kompakt ruta How this answer was analyzed för färdiga rader, med metod, scope-/retrievaldetaljer, bokstavliga sökord som användes och eventuella extra sökord före slutsvaret./feed/entry/{contentId})/feed/entry/{contentId} kan nu växla mellan den befintliga highlight-diffen och en side-by-side-jämförelse mellan före/efter via sidans diff-toggle (?diff_view=inline eller ?diff_view=side_by_side)./feed/feed/c/{categorySlug} i ny flik/feed uppdaterar nu också dessa Read more-knappar när ett ihopfällt kategorikort öppnas, så längre analyser går att expandera där igen och inte bara i kortvyn./feed visar nu exakt en vald publik utgåva per period (daily, weekly, monthly, yearly) för varje kategori-/sajtblock./feed; använd /feed/cards/{categorySlug}?show_all=1 när du medvetet vill granska alla sparade utgåvor för en kategori./rsspermission:rss/rss/{urlid}/publishby-mappingspublishby-värden (till exempel 4, 27 eller andra ofärdiga identifierare) till ett riktigt visningsnamnurlid, så samma råa publishby-värde kan återanvändas av en annan feed utan krockar/feed-sidor, kategorikort, listan över redigerade poster, Feed Q&A och /api/rss/feed/{site}-läsareSite Type stöder nu explicit xpath och json utöver rss och wpsitetype=xpath krävs elements-regler i JSON och valideras server-side innan sparningelements accepterar båda stödda regel-formaten:
begin + table) för JSON-traversering/rss visas elements-redigering nu bara för xpath-rader och ligger i en kollapsbar panel med AJAX-sparning på blur/rss/xpath-lab låter redaktörer klistra in HTML-snippets, inspektera DOM-översikt, testa XPath-uttryck och granska en SimpleXML-liknande XML-preview innan regler sparasURL medan den först inmatade sid-URL:en bevaras i Real URL/rss gör nu en server-side-dupe-kontroll före insert. Om inskickad URL eller Real URL redan matchar en befintlig feedrad (även korsmatch mellan fälten) blockeras insert och den matchande raden visas i varningen.401 / 403 från /wp-json/wp/v2/posts) som obrukbara och fortsätter vanlig feedupptäckt, så låsta WordPress-installationer kan falla tillbaka till /feed eller <link rel="alternate">external?type=rss2... och external.php?type=RSS2..., inklusive relativa <link rel="alternate">-feedlänkar som hittas på forumsidor.content.publishby när feeden skickar med sådan metadata (t.ex. dc:creator).content:encoded, dc:creator, guid, pubDate), prioriterar content:encoded som fulltext när den finns och använder stabil fallback (guid/link/hash) när länk saknas./feed-adminrss.posting.handle får nu också ett dedikerat Posting Queue-gränssnitt på både /feed-admin/posting-queue och /rss/posting-queueHandle group, Handle page, Handled group och Handled page, tillsammans med artikelns titel, ett kort ingressutdrag och källänkenreview, group, page och done, så en bot eller operatör kan fokusera enbart på väntande gruppposter, enbart på väntande sidposter eller det redan hanterade arkivetsegment anchor -> global anchor -> dagens datumdaily = den dagen, weekly = ISO-vecka med måndag som start, monthly = kalendermånad, yearly = kalenderår)watch_for-text före generering/feed får använda/feed-admin innehåller nu också en panel för Feed script snippets / embeddable widgets där operatören kan spara återanvändbara JavaScript-boxar, autospara dem via AJAX, låta AI generera inline-scriptet och kopiera en mergad bundle-URL för externa sajtinbäddningar./feed-admin med separata aktivera/inaktivera- och tidsfält per period för daily, weekly, monthly och yearly.schedule:run eller direkt via php artisan rss:run-scheduled-analytics).[AUTO] Scheduled analytics) och kör alltid med overwrite-current-semantik så att automatiska varianter uppdateras på plats.php artisan rss:generate-analytics --period=yearly --force (eller --overwrite-current) för att uttryckligen köra om och skriva över den aktuella bucketraden även när underliggande snapshot är oförändrat./rss-maintenance-adminhttps://tools.tornevall.com/apihttps://tools.tornevall.net/apiRSS API-endpoints använder provider-specifika API-nycklar:
scraper=1 krävs på /api/rss/urls/api/rss, /api/rss/feed/{site})/api/rss/data) accepterar anropet utan extra autentisering (rate-limitade)/api/rss/analytics/run) kräver Authorization: Bearer <ANALYTICS_CRON_SECRET>/api/rss/posting-queue/items*) kräver inloggad webbsession samt den dedikerade behörigheten rss.posting.handle/api/managed-scripts/feed och /api/managed-scripts/feed/bundle.js; se docs/frontend-script-boxes för det delade scriptbox-kontraktet.feed-scriptendpointsen accepterar nu också additiva filterparametrar som feed_ids, feeds, categories, groups, category_slugs och limit, och skickar tillbaka den normaliserade tolkningen som query_context.filters.GET /api/rss/posting-queue/itemsReturnerar operatörens posting queue som JSON för den aktuellt inloggade användaren.
Queryparametrar:
queue=review|group|page|done (standard review)category=<category-slug>feed_id=<urlid>per_page=<10..250>Svaret innehåller:
filterspaginationitems[] med contentid, urlid, title, description, excerpt, link, feed_title, feed_category, entry_url och queue_statusPATCH /api/rss/posting-queue/items/{contentId}Uppdaterar checkbox-status för en kö-rad.
Stödda booleanfält:
handle_grouphandle_pagehandled_grouphandled_pageValfritt hjälpfält:
queue=review|group|page|done så att svaret också kan tala om för klienten om raden ska tas bort direkt ur den aktuella filtrerade listan.Success-svar innehåller:
contentidqueue_statusshould_removeGET /api/rssReturnerar översikt med URL-lista, kategorier och tillgänglig parameterinfo.
Svar (200)
{
"urls": [
{
"urlid": 12,
"title": "Exempelfeed",
"url": "https://example.com/rss",
"real_url": "https://example.com/rss",
"category": "Nyheter",
"readinterval": 60,
"lastscrape": "2026-04-01 08:00:00",
"publicSelector": "12",
"hidden": false,
"feedUrl": "/api/rss/feed/12",
"categoryFeedUrl": "/api/rss/feed/nyheter"
}
],
"categories": [
{ "name": "Nyheter", "slug": "nyheter", "feedCount": 3 }
],
"availParams": { "always": [0, 1], "scraper": [0, 1] }
}
GET /api/rss/urlsReturnerar skrapbara feed-URL:er. Kräver scraper=1.
Query-parametrar
| Parameter | Krav | Beskrivning |
|---|---|---|
scraper |
ja | Måste vara 1 annars avvisas anropet med 403 |
agent_id |
rekommenderas | Stabilt agent/worker-ID. Används för per-agent due-fönster |
agent_name |
fallback | Fallback-identifierare när agent_id saknas |
always |
nej | 0 (standard) = due-urval för agent; 1 = alla skrapbara rader |
limit |
nej | Max antal rader när always=0 |
always=0-beteende:
readinterval och agentens senaste claim-tidpunktidle-rapport med väntetrådar (wait_seconds, next_poll_at och next_url) så scraperklienter kan backa av intelligent i stället för att gissa.always=1-beteende:
deleted=0 och noscrape=0 — ingen intervallfiltreringSvar (200)
{
"urls": [
{
"urlid": 12,
"url": "https://example.com/rss",
"real_url": "https://example.com/rss",
"readinterval": 60,
"sitetype": "rss",
"method": "GET",
"elements": null
}
],
"agent": { "agent_id": "scraper-node-1", "resolved_name": "scraper-node-1" },
"idle": {
"is_idle": false,
"reason": "urls_available",
"schedule_mode": "per_agent_seen",
"wait_seconds": null,
"wait_minutes": null,
"next_poll_at": null,
"next_url": null,
"scrapeable_total": 125
}
}
Exempel på idle-svar (inga URL:er är due just nu):
{
"urls": [],
"agent": { "agent_id": "scraper-node-1", "resolved_name": "scraper-node-1" },
"idle": {
"is_idle": true,
"reason": "no_urls_due_for_agent",
"schedule_mode": "per_agent_seen",
"wait_seconds": 173,
"wait_minutes": 3,
"next_poll_at": "2026-04-05 14:20:00",
"next_url": {
"urlid": 12,
"title": "Exempelfeed",
"url": "https://example.com/rss"
},
"scrapeable_total": 125
}
}
Den medföljande scrape-runnern använder dessa idle-fält för att logga hur länge den bör vänta innan nästa due-URL förväntas.
POST /api/rss/dataTar emot rådata från en scraper-worker.
Request body
{
"agent_id": "scraper-node-1",
"content": {
"12": "<rss version=\"2.0\">...</rss>",
"34": "<html>...</html>"
}
}
| Fält | Typ | Beskrivning |
|---|---|---|
agent_id |
string | Valfri men rekommenderas; identifierar scrapers |
content |
object | Nycklar är numeriska urlid-strängar; värden är rå feed- eller HTML-data |
Svar (200)
{
"received": {
"12": { "dataLength": 14200, "url": "https://example.com/rss", "title": "Exempelfeed" }
},
"exceptions": {},
"agent": { "agent_id": "scraper-node-1" }
}
Varje received[{urlid}]-objekt innehåller:
dataLength – antal byte av accepterad dataurl – käll-URL från urls.urltitle – feed-titel från urls.title (användbart för loggar och Google Alerts-spårbarhet)GET /api/rss/updateBearbetar köade inbound-poster till normaliserat innehåll och triggar prenumerationsleverans.
Query-parametrar
| Parameter | Beskrivning |
|---|---|
urlid |
Valfritt heltal. När det anges bearbetas bara inbound-rader för den feeden i det anropet |
Köunderhållsbeteende:
handled=1, processlock=0) rensas vid varje körningSvar (200)
{
"converted": 12,
"skipped": 2,
"urlid_filter": 27,
"subscriptionNotifications": {
"processed": 3,
"delivered": 2,
"skipped": 1
}
}
urlid_filter inkluderas bara när urlid-query-parametern användes.
GET /api/rss/feed/{site}Returnerar en Atom/RSS-feed för en specifik sajt eller kategori.
Selector-beteende för {site}:
urlid — specifik feedpublic_hash — direktåtkomst för dolda feeds (kringgår dolt-filter)analytics-daily / daily-analyticsanalytics-weekly / weekly-analyticsanalytics-monthly / monthly-analyticsanalytics-yearly / yearly-analyticsanalytics-bulk / bulk-analytics (alla perioder kombinerade)POST /api/rss/analytics/runTriggar AI-analytics-generering programmatiskt (för cron eller externa triggers).
Autentisering: Authorization: Bearer <ANALYTICS_CRON_SECRET>
Request body (alla fält valfria)
{
"period": "weekly",
"categories": "all",
"sites": false,
"model": "gpt-4o-mini",
"user_id": 1,
"max_tokens": 1400,
"dry_run": false
}
| Fält | Typ | Standard | Beskrivning |
|---|---|---|---|
period |
string | weekly |
daily, weekly, monthly, yearly, all |
categories |
string | all |
Kommaseparerade kategorinamn eller all |
sites |
boolean | false |
Generera även site-analys |
model |
string | gpt-4o-mini |
OpenAI-modellnamn |
user_id |
integer | 1 |
Användar-ID för attribution |
max_tokens |
integer | 1400 |
Max utdata-tokens per analysobjekt |
dry_run |
boolean | false |
Planera körning utan att anropa AI |
/feed/user-questions)Skicka fria frågor mot RSS-datan och hämta svarshistorik.
POST /feed/user-questionsSkicka en fråga. Gäster kräver Cloudflare Turnstile. Inloggade användare slipper Turnstile.
Request (formulär eller JSON)
| Fält | Typ | Beskrivning |
|---|---|---|
question |
string | Frågetexten |
question_period |
string | daily, weekly, monthly (standard), yearly, all_time |
period |
string | Äldre alias för question_period |
keyword_aggressiveness |
string | strict, balanced (standard) eller expansive |
focus_categories[] |
array | Begränsa context till specifika kategori-slugs |
focus_site_ids[] |
array | Begränsa context till max 10 specifika urlid-värden |
cf-turnstile-response |
string | Cloudflare Turnstile-token (gäster) |
JSON-svar (när Accept: application/json)
{
"ok": true,
"answer": "Baserat på tillgänglig context...",
"question_id": 42,
"model": "gpt-5.4",
"latency_ms": 1830,
"context_stats": {
"feed_count": 17,
"entry_count": 120,
"period_type": "monthly",
"period_start": "2026-03-01 00:00:00",
"period_end": "2026-03-31 23:59:59"
}
}
Focus selector-beteende:
focus_site_ids[] med ≤10 ID aktiverar JSON context-läge: AI tar emot ett version_history.articles-block med all lagrad redigeringshistorik oavsett tidsperiodfocus_categories[] filtrerar context till matchande feedsfocus_site_ids[]Varje version-sample i version_history.articles innehåller:
v — sekvensnummer (1 = äldst, N = nyast)hash — 6-teckens prefix av content_hash för spårbarhetpublished — tidpunkt för den lagrade versionentitle — rubrik vid den versionendescription — upp till 220 tecken av description (när ej tom)content — upp till 320 tecken av content (när ej tom)När version_count ≤ VERSION_SAMPLE_LIMIT visas alla versioner. För artiklar med fler versioner väljs representativa urval spridda över hela historikspannet.
/rss/xpath-lab)XPath Lab är tillgängligt via /rss/xpath-lab och kräver permission:rss.
elements-pipeline-regler (samma 5-elements JSON som urls.elements)value-extraktorer som href eller src kommer att hoppas över av legacy-renderarenelements / Pipeline JSON-formatXPath-feeds (sitetype=xpath) lagrar extraheringsregler i urls.elements som en 5-elements JSON-array:
[
element 0: Radselectors (array med absoluta XPaths)
element 1: Fält-XPaths (objekt: fältnamn → array med relativa XPaths)
element 2: Värdetyper som används (försök helst hålla dig till bara "value")
element 3: Källkarta (objekt: fältnamn → "mainNode")
element 4: Output-mappning (objekt: RSS-fält → [fältnamn, värdetyp])
]
Obligatoriska output-fält i element 4: title, description, link. Valfritt: pubdate.
Rekommenderat exempel — attributnoder mappade via value:
[
[
"//*[@role='main']//ol[contains(concat(' ',normalize-space(@class),' '),' sap-search__result ')]/li[contains(concat(' ',normalize-space(@class),' '),' sap-search__result-item ')]",
"//*[@role='main']//li[contains(concat(' ',normalize-space(@class),' '),' sap-search__result-item ')]",
"//li[contains(concat(' ',normalize-space(@class),' '),' sap-search__result-item ')]"
],
{
"titleNode": [
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[contains(concat(' ',normalize-space(@class),' '),' sv-notopmargin ')]/a",
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[@tabindex='0']/a"
],
"titleHrefNode": [
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[contains(concat(' ',normalize-space(@class),' '),' sv-notopmargin ')]/a/@href",
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[@tabindex='0']/a/@href"
],
"summary": [
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/p[contains(concat(' ',normalize-space(@class),' '),' normal ')]",
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/p"
],
"date": [
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__meta ')]/span[2]",
"/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__text ')]/div[contains(concat(' ',normalize-space(@class),' '),' sap-search__meta ')]/*[2]"
]
},
["value"],
{
"titleNode": "mainNode",
"titleHrefNode": "mainNode",
"summary": "mainNode",
"date": "mainNode"
},
{
"title": ["titleNode", "value"],
"description": ["summary", "value"],
"link": ["titleHrefNode", "value"],
"pubdate": ["date", "value"]
}
]
XPath-konventioner:
/// (enkelt snedstreck = barnaxel relativt matchad radnod). Scrapern lägger till . vid runtime för att göra dem kontextuella/@href, /@src, /@datetime) och sedan mappa den med "value"contains(@class, ...)-mönster bör använda concat(' ',normalize-space(@class),' ') för exakt matchning av klassnamnViktig legacy-parser-notering:
value-extraktorer om inte pipeline[3] också deklarerar just den extractor-nyckeln (till exempel "href": "mainNode").link, src eller datetime, skriv om fältet till en dedikerad attributnod-XPath och mappa det via "value".Använda XPath Lab för att debugga en pipeline:
elements-JSON i fältet Pipeline ruleshref / src-kompatibilitet, skriv om dessa värden till dedikerade attributnodfält (/@href, /@src, /@datetime) mappade via "value"Inloggade användare kan prenumerera per:
Tillgängliga kanaler beror på kontoinställningar.
På /feed/subscriptions är kanalinställningarna nu AJAX-first med autosave:
Om JavaScript saknas finns fortfarande fallback till vanlig server-post/redirect.
Discord-setup på /feed/subscriptions:
webhook.incoming och går tillbaka via callback (/oauth/discord/callback).Leveransbeteende:
/api/rss/update har konverterat inbound-rader/feed/entry/{contentId}), med originallänken som sekundär fallbackrss:notify-subscribers körs fortfarande var femtonde minut som fallback/återförsök om en omedelbar leverans missas eller en kanal tillfälligt fallerar