{"$comment":"A webhook endpoint's messages (docs/webhooks.md), generated by services/dashboard/backend/tests/test_webhook_message_wire.py: an example of each, with the headers it is sent with, signed by Standard Webhooks with example_secret (public: check a receiver's verification against these), the limits a receiver meets, how each answer is taken, and how to read the messages. The bodies' JSON Schema is webhook_message.v1.schema.json; each event's, its type's in docs/wire/events/, whose data a feed event takes from feed_frame.v1.json.","v":1,"example_secret":"whsec_d2ViaG9vay1leGFtcGxlLXNlY3JldC12MSEh","messages":{"events":{"headers":{"webhook-id":"msg_1d379278e867509b5ba09a4dfcd7eaf6","webhook-timestamp":"1791439212","webhook-signature":"v1,jlH1Y9afJmxRyfwNSyRjrhUEG1G5DZ28FDd89yyRbfw=","quanor-webhook-attempt":"1","content-type":"application/json","user-agent":"Quanor-Webhooks/1"},"body":{"access_version":"b4d934cf","complete":true,"events":[{"companyid":28,"data":{"access":"full","changes":[],"company":{"company_id":28,"listed_exchange":"STO","logo_url":null,"market_exchange_id":1,"market_exchange_mic":"XSTO","name":"Alfa Group AB","short_name":"Alfa Group","symbol":"ALFA B"},"corrected_at":"2026-10-08T06:40:00.300000Z","feed_item_id":"announcement:88001","first_seq":1040,"flags":{"corrected":true},"head":{"announcement_id":88001,"announcement_kind":"order","edition_ids":[5001,5002],"first_flash_at":"2026-10-08T06:00:00.341000Z","inside_information":true,"language":"sv","received_at":"2026-10-08T06:00:00.300000Z","report":null,"route":"press_release","title":"Alfa wins order"},"item_kind":"announcement","lang":"en","op":"changed","parts":[{"corrects":[],"created_at":"2026-10-08T06:00:00.351000Z","edition_id":5001,"flash_id":11,"flash_type":"main","headline":"Alfa wins SEK 500M order","kind":"flash","part_id":"flash:11","part_version":1791439200351000,"relevance":4,"sentiment":4,"sentiment_confidence":4},{"corrects":[],"created_at":"2026-10-08T06:00:00.352000Z","edition_id":5001,"flash_id":12,"flash_type":"context","headline":"Deliveries start in Q1 2027","kind":"flash","part_id":"flash:12","part_version":1791439200352000,"relevance":4,"sentiment":4,"sentiment_confidence":4},{"corrected":true,"first_published_at":"2026-10-08T06:00:12.300000Z","headline":"Alfa wins its largest order","inside_information":true,"kicker":null,"kind":"story","lang":"en","lede_first_sentence":"Alfa Group has won an order worth SEK 500 million from Northern Data Centres, its largest to date.","part_id":"story:7101","part_version":2,"reason":"correction","relevance":4,"report":null,"story_id":7101,"treatment":"full","url":"https://app.quanor.com/articles/story/7101","version":2,"version_published_at":"2026-10-08T06:40:00.300000Z"}],"published_at":"2026-10-08T06:00:00.000000Z","seq":1045,"sort_at":"2026-10-08T06:00:00.300000Z","superseded_parts":["flash:9"],"type":"item"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json","id":"evt_2qyd41b3mqbv451ksq45hkm6tf","sequence":"0000000001.0000000000000001045","source":"https://api.quanor.com/v1/feed","specversion":"1.0","subject":"announcement:88001","type":"announcement.updated"},{"data":{"feed_item_id":"announcement:88001","seq":1048,"type":"hidden"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/announcement.hidden.v1.data.schema.json","id":"evt_1zrs9j3563b1tqssanx7rs4ajv","sequence":"0000000001.0000000000000001048","source":"https://api.quanor.com/v1/feed","specversion":"1.0","subject":"announcement:88001","type":"announcement.hidden"}],"generation":3,"since":"1.1040","through":"1.1050","track":"feed","v":1,"webhook_endpoint_id":"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20"},"body_bytes":"{\"access_version\":\"b4d934cf\",\"complete\":true,\"events\":[{\"companyid\":28,\"data\":{\"access\":\"full\",\"changes\":[],\"company\":{\"company_id\":28,\"listed_exchange\":\"STO\",\"logo_url\":null,\"market_exchange_id\":1,\"market_exchange_mic\":\"XSTO\",\"name\":\"Alfa Group AB\",\"short_name\":\"Alfa Group\",\"symbol\":\"ALFA B\"},\"corrected_at\":\"2026-10-08T06:40:00.300000Z\",\"feed_item_id\":\"announcement:88001\",\"first_seq\":1040,\"flags\":{\"corrected\":true},\"head\":{\"announcement_id\":88001,\"announcement_kind\":\"order\",\"edition_ids\":[5001,5002],\"first_flash_at\":\"2026-10-08T06:00:00.341000Z\",\"inside_information\":true,\"language\":\"sv\",\"received_at\":\"2026-10-08T06:00:00.300000Z\",\"report\":null,\"route\":\"press_release\",\"title\":\"Alfa wins order\"},\"item_kind\":\"announcement\",\"lang\":\"en\",\"op\":\"changed\",\"parts\":[{\"corrects\":[],\"created_at\":\"2026-10-08T06:00:00.351000Z\",\"edition_id\":5001,\"flash_id\":11,\"flash_type\":\"main\",\"headline\":\"Alfa wins SEK 500M order\",\"kind\":\"flash\",\"part_id\":\"flash:11\",\"part_version\":1791439200351000,\"relevance\":4,\"sentiment\":4,\"sentiment_confidence\":4},{\"corrects\":[],\"created_at\":\"2026-10-08T06:00:00.352000Z\",\"edition_id\":5001,\"flash_id\":12,\"flash_type\":\"context\",\"headline\":\"Deliveries start in Q1 2027\",\"kind\":\"flash\",\"part_id\":\"flash:12\",\"part_version\":1791439200352000,\"relevance\":4,\"sentiment\":4,\"sentiment_confidence\":4},{\"corrected\":true,\"first_published_at\":\"2026-10-08T06:00:12.300000Z\",\"headline\":\"Alfa wins its largest order\",\"inside_information\":true,\"kicker\":null,\"kind\":\"story\",\"lang\":\"en\",\"lede_first_sentence\":\"Alfa Group has won an order worth SEK 500 million from Northern Data Centres, its largest to date.\",\"part_id\":\"story:7101\",\"part_version\":2,\"reason\":\"correction\",\"relevance\":4,\"report\":null,\"story_id\":7101,\"treatment\":\"full\",\"url\":\"https://app.quanor.com/articles/story/7101\",\"version\":2,\"version_published_at\":\"2026-10-08T06:40:00.300000Z\"}],\"published_at\":\"2026-10-08T06:00:00.000000Z\",\"seq\":1045,\"sort_at\":\"2026-10-08T06:00:00.300000Z\",\"superseded_parts\":[\"flash:9\"],\"type\":\"item\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json\",\"id\":\"evt_2qyd41b3mqbv451ksq45hkm6tf\",\"sequence\":\"0000000001.0000000000000001045\",\"source\":\"https://api.quanor.com/v1/feed\",\"specversion\":\"1.0\",\"subject\":\"announcement:88001\",\"type\":\"announcement.updated\"},{\"data\":{\"feed_item_id\":\"announcement:88001\",\"seq\":1048,\"type\":\"hidden\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/announcement.hidden.v1.data.schema.json\",\"id\":\"evt_1zrs9j3563b1tqssanx7rs4ajv\",\"sequence\":\"0000000001.0000000000000001048\",\"source\":\"https://api.quanor.com/v1/feed\",\"specversion\":\"1.0\",\"subject\":\"announcement:88001\",\"type\":\"announcement.hidden\"}],\"generation\":3,\"since\":\"1.1040\",\"through\":\"1.1050\",\"track\":\"feed\",\"v\":1,\"webhook_endpoint_id\":\"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20\"}"},"events with a refetch":{"headers":{"webhook-id":"msg_2ef2570210409630161ff1844efd9f21","webhook-timestamp":"1791439212","webhook-signature":"v1,H5JMmdKteI6Sp0abSSKhTx/76tU/ZTDjggVONX46JUg=","quanor-webhook-attempt":"1","content-type":"application/json","user-agent":"Quanor-Webhooks/1"},"body":{"access_version":"b4d934cf","complete":true,"events":[{"data":{"feed_item_id":"announcement:88001","op":"changed","seq":1052,"type":"refetch"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json","id":"evt_2xsn0jfd40kn2c51j0hmcpej9q","sequence":"0000000001.0000000000000001052","source":"https://api.quanor.com/v1/feed","specversion":"1.0","subject":"announcement:88001","type":"announcement.updated"}],"generation":3,"since":"1.1050","through":"1.1052","track":"feed","v":1,"webhook_endpoint_id":"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20"},"body_bytes":"{\"access_version\":\"b4d934cf\",\"complete\":true,\"events\":[{\"data\":{\"feed_item_id\":\"announcement:88001\",\"op\":\"changed\",\"seq\":1052,\"type\":\"refetch\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json\",\"id\":\"evt_2xsn0jfd40kn2c51j0hmcpej9q\",\"sequence\":\"0000000001.0000000000000001052\",\"source\":\"https://api.quanor.com/v1/feed\",\"specversion\":\"1.0\",\"subject\":\"announcement:88001\",\"type\":\"announcement.updated\"}],\"generation\":3,\"since\":\"1.1050\",\"through\":\"1.1052\",\"track\":\"feed\",\"v\":1,\"webhook_endpoint_id\":\"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20\"}"},"reset":{"headers":{"webhook-id":"msg_07881984840ea566687776e3b8389cc9","webhook-timestamp":"1791439212","webhook-signature":"v1,ngZ8H0nXs0Q31PYpRmYgIaquq676zW3zlYW9/nvqJNM=","quanor-webhook-attempt":"1","content-type":"application/json","user-agent":"Quanor-Webhooks/1"},"body":{"access_version":"b4d934cf","events":[{"data":{"access_version":"b4d934cf","generation":4,"reason":"access_changed","resume_from":"1.1052","track":"feed"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/webhook_endpoint.reset.v1.data.schema.json","id":"evt_79e9tqep7few2aepcfacnq8p7q","source":"https://api.quanor.com/v1/webhook-endpoints","specversion":"1.0","type":"webhook_endpoint.reset"}],"generation":4,"track":"feed","v":1,"webhook_endpoint_id":"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20"},"body_bytes":"{\"access_version\":\"b4d934cf\",\"events\":[{\"data\":{\"access_version\":\"b4d934cf\",\"generation\":4,\"reason\":\"access_changed\",\"resume_from\":\"1.1052\",\"track\":\"feed\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/webhook_endpoint.reset.v1.data.schema.json\",\"id\":\"evt_79e9tqep7few2aepcfacnq8p7q\",\"source\":\"https://api.quanor.com/v1/webhook-endpoints\",\"specversion\":\"1.0\",\"type\":\"webhook_endpoint.reset\"}],\"generation\":4,\"track\":\"feed\",\"v\":1,\"webhook_endpoint_id\":\"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20\"}"},"test":{"headers":{"webhook-id":"msg_5f0e3c1a7b2d4e8f9a6b1c2d3e4f5a6b","webhook-timestamp":"1791439212","webhook-signature":"v1,tm10WnR8W9ef303kiR1ym7k51raLnb0dJ6orVQeTJVc=","quanor-webhook-attempt":"1","content-type":"application/json","user-agent":"Quanor-Webhooks/1"},"body":{"events":[{"data":{"test_send_id":"5f0e3c1a-7b2d-4e8f-9a6b-1c2d3e4f5a6b"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/webhook_endpoint.tested.v1.data.schema.json","id":"evt_28w85e1wvbctakyt5afbgbqn9h","source":"https://api.quanor.com/v1/webhook-endpoints","specversion":"1.0","type":"webhook_endpoint.tested"}],"v":1,"webhook_endpoint_id":"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20"},"body_bytes":"{\"events\":[{\"data\":{\"test_send_id\":\"5f0e3c1a-7b2d-4e8f-9a6b-1c2d3e4f5a6b\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/webhook_endpoint.tested.v1.data.schema.json\",\"id\":\"evt_28w85e1wvbctakyt5afbgbqn9h\",\"source\":\"https://api.quanor.com/v1/webhook-endpoints\",\"specversion\":\"1.0\",\"type\":\"webhook_endpoint.tested\"}],\"v\":1,\"webhook_endpoint_id\":\"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20\"}"},"test of a type":{"headers":{"webhook-id":"msg_6a1f4d2b8c3e4f9a8b7c2d3e4f5a6b7c","webhook-timestamp":"1791439212","webhook-signature":"v1,JDoaje+/78rCUZ0AUPT7lDn/UKDKPbWxWtYfbx3zFDY=","quanor-webhook-attempt":"1","content-type":"application/json","user-agent":"Quanor-Webhooks/1"},"body":{"events":[{"data":{"example":{"companyid":28,"data":{"access":"full","changes":[],"company":{"company_id":28,"listed_exchange":"STO","logo_url":null,"market_exchange_id":1,"market_exchange_mic":"XSTO","name":"Alfa Group AB","short_name":"Alfa Group","symbol":"ALFA B"},"corrected_at":"2026-10-08T06:40:00.300000Z","feed_item_id":"announcement:88001","first_seq":1040,"flags":{"corrected":true},"head":{"announcement_id":88001,"announcement_kind":"order","edition_ids":[5001,5002],"first_flash_at":"2026-10-08T06:00:00.341000Z","inside_information":true,"language":"sv","received_at":"2026-10-08T06:00:00.300000Z","report":null,"route":"press_release","title":"Alfa wins order"},"item_kind":"announcement","lang":"en","op":"changed","parts":[{"corrects":[],"created_at":"2026-10-08T06:00:00.351000Z","edition_id":5001,"flash_id":11,"flash_type":"main","headline":"Alfa wins SEK 500M order","kind":"flash","part_id":"flash:11","part_version":1791439200351000,"relevance":4,"sentiment":4,"sentiment_confidence":4},{"corrects":[],"created_at":"2026-10-08T06:00:00.352000Z","edition_id":5001,"flash_id":12,"flash_type":"context","headline":"Deliveries start in Q1 2027","kind":"flash","part_id":"flash:12","part_version":1791439200352000,"relevance":4,"sentiment":4,"sentiment_confidence":4},{"corrected":true,"first_published_at":"2026-10-08T06:00:12.300000Z","headline":"Alfa wins its largest order","inside_information":true,"kicker":null,"kind":"story","lang":"en","lede_first_sentence":"Alfa Group has won an order worth SEK 500 million from Northern Data Centres, its largest to date.","part_id":"story:7101","part_version":2,"reason":"correction","relevance":4,"report":null,"story_id":7101,"treatment":"full","url":"https://app.quanor.com/articles/story/7101","version":2,"version_published_at":"2026-10-08T06:40:00.300000Z"}],"published_at":"2026-10-08T06:00:00.000000Z","seq":1045,"sort_at":"2026-10-08T06:00:00.300000Z","superseded_parts":["flash:9"],"type":"item"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json","id":"evt_2qyd41b3mqbv451ksq45hkm6tf","sequence":"0000000001.0000000000000001045","source":"https://api.quanor.com/v1/feed","specversion":"1.0","subject":"announcement:88001","type":"announcement.updated"},"test_send_id":"6a1f4d2b-8c3e-4f9a-8b7c-2d3e4f5a6b7c"},"datacontenttype":"application/json","dataschema":"https://api.quanor.com/api/docs/events/webhook_endpoint.tested.v1.data.schema.json","id":"evt_1646hrztkkhbn7gfbrhsz8kbcf","source":"https://api.quanor.com/v1/webhook-endpoints","specversion":"1.0","type":"webhook_endpoint.tested"}],"v":1,"webhook_endpoint_id":"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20"},"body_bytes":"{\"events\":[{\"data\":{\"example\":{\"companyid\":28,\"data\":{\"access\":\"full\",\"changes\":[],\"company\":{\"company_id\":28,\"listed_exchange\":\"STO\",\"logo_url\":null,\"market_exchange_id\":1,\"market_exchange_mic\":\"XSTO\",\"name\":\"Alfa Group AB\",\"short_name\":\"Alfa Group\",\"symbol\":\"ALFA B\"},\"corrected_at\":\"2026-10-08T06:40:00.300000Z\",\"feed_item_id\":\"announcement:88001\",\"first_seq\":1040,\"flags\":{\"corrected\":true},\"head\":{\"announcement_id\":88001,\"announcement_kind\":\"order\",\"edition_ids\":[5001,5002],\"first_flash_at\":\"2026-10-08T06:00:00.341000Z\",\"inside_information\":true,\"language\":\"sv\",\"received_at\":\"2026-10-08T06:00:00.300000Z\",\"report\":null,\"route\":\"press_release\",\"title\":\"Alfa wins order\"},\"item_kind\":\"announcement\",\"lang\":\"en\",\"op\":\"changed\",\"parts\":[{\"corrects\":[],\"created_at\":\"2026-10-08T06:00:00.351000Z\",\"edition_id\":5001,\"flash_id\":11,\"flash_type\":\"main\",\"headline\":\"Alfa wins SEK 500M order\",\"kind\":\"flash\",\"part_id\":\"flash:11\",\"part_version\":1791439200351000,\"relevance\":4,\"sentiment\":4,\"sentiment_confidence\":4},{\"corrects\":[],\"created_at\":\"2026-10-08T06:00:00.352000Z\",\"edition_id\":5001,\"flash_id\":12,\"flash_type\":\"context\",\"headline\":\"Deliveries start in Q1 2027\",\"kind\":\"flash\",\"part_id\":\"flash:12\",\"part_version\":1791439200352000,\"relevance\":4,\"sentiment\":4,\"sentiment_confidence\":4},{\"corrected\":true,\"first_published_at\":\"2026-10-08T06:00:12.300000Z\",\"headline\":\"Alfa wins its largest order\",\"inside_information\":true,\"kicker\":null,\"kind\":\"story\",\"lang\":\"en\",\"lede_first_sentence\":\"Alfa Group has won an order worth SEK 500 million from Northern Data Centres, its largest to date.\",\"part_id\":\"story:7101\",\"part_version\":2,\"reason\":\"correction\",\"relevance\":4,\"report\":null,\"story_id\":7101,\"treatment\":\"full\",\"url\":\"https://app.quanor.com/articles/story/7101\",\"version\":2,\"version_published_at\":\"2026-10-08T06:40:00.300000Z\"}],\"published_at\":\"2026-10-08T06:00:00.000000Z\",\"seq\":1045,\"sort_at\":\"2026-10-08T06:00:00.300000Z\",\"superseded_parts\":[\"flash:9\"],\"type\":\"item\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/announcement.updated.v1.data.schema.json\",\"id\":\"evt_2qyd41b3mqbv451ksq45hkm6tf\",\"sequence\":\"0000000001.0000000000000001045\",\"source\":\"https://api.quanor.com/v1/feed\",\"specversion\":\"1.0\",\"subject\":\"announcement:88001\",\"type\":\"announcement.updated\"},\"test_send_id\":\"6a1f4d2b-8c3e-4f9a-8b7c-2d3e4f5a6b7c\"},\"datacontenttype\":\"application/json\",\"dataschema\":\"https://api.quanor.com/api/docs/events/webhook_endpoint.tested.v1.data.schema.json\",\"id\":\"evt_1646hrztkkhbn7gfbrhsz8kbcf\",\"source\":\"https://api.quanor.com/v1/webhook-endpoints\",\"specversion\":\"1.0\",\"type\":\"webhook_endpoint.tested\"}],\"v\":1,\"webhook_endpoint_id\":\"8d2f0c39-2b63-4c55-9a8a-3f5b1d7c1e20\"}"}},"signature":{"headers":{"webhook-id":"the message's id, msg_ and 32 hex digits: the same on every attempt of an identical body","webhook-timestamp":"when the attempt was signed, in Unix seconds","webhook-signature":"space-separated v1,<base64 HMAC-SHA256 of \"{webhook-id}.{webhook-timestamp}.{body}\">, one for each secret that signs; the key is the secret's base64 after whsec_, decoded","quanor-webhook-attempt":"the attempt number, from 1, counting every attempt since the last successful delivery; a retry rebuilt with newer data gets a new webhook-id but keeps the count. Not signed: use it for logging only"},"tolerance_s":300,"rotation_overlap_s":86400,"rotation_overlap_max_s":604800},"limits":{"$comment":"Accept bodies up to max_body_bytes. A message of several items' events is at most message_bytes; one item larger than that is sent alone. A message holds at most max_events events. Answer within send_timeout_s; only the first answer_bytes_read bytes of your answer are read. A failing message is retried after a backoff up to backoff_max_s, and after a Retry-After up to retry_after_max_s; after notice_after_s of failure your key's notice address is mailed, after reset_after_failing_s the backlog is replaced by a reset (reason behind), and after pause_after_s the endpoint is paused.","max_body_bytes":1048576,"message_bytes":262144,"max_events":200,"send_timeout_s":15,"answer_bytes_read":65536,"retry_after_max_s":3600,"backoff_max_s":3600,"notice_after_s":86400,"pause_after_s":432000,"reset_after_failing_s":86400,"ports":[443]},"answers":{"2xx":"delivered: the next message follows","410":"the endpoint is paused (gone) until you resume it","413":"a message of several items' events is sent again, half the size, at once or after a Retry-After it states; a single item's, as its refetch","429, 503 with Retry-After":"sent again at the time stated, in seconds or as an HTTP date, at most an hour later","any other answer, a redirect, or none within send_timeout_s":"sent again after a backoff with full jitter, at most an hour later, and never sooner than a Retry-After it states"},"reading":["Verify the signature, with the secrets of the endpoint the message names (webhook_endpoint_id), and the timestamp; refuse a message that fails either. A receiver serving several endpoints keeps a copy for each.","Verify over the raw body bytes as received, before any JSON parsing: parsing and serialising again changes the bytes.","Store the message durably with its webhook-id, respond 2xx within send_timeout_s, and apply it afterwards. A message whose webhook-id you stored before is a duplicate: respond 2xx and do not apply it again.","Apply each endpoint's stored messages one at a time, for each track, in the order you received them; a background job must not reorder them. Quanor sends one at a time and waits for the 2xx, so that order is Quanor's: a reset is applied before anything sent after it, and a message applied ahead of an earlier reset makes that reset read as older, so it is skipped.","De-duplicate events by id, for each endpoint. An event's id names one change rendered for the same key's access and language: it is the same on every retry and rewind, on every endpoint of that key with that language, and in /v1/feed/since asked with include_event_ids (a refetch is an event of its own).","Keep the event ids you applied with the copy, in the same transactions and backups: after you restore a backup and rewind, Quanor resends what you applied since the backup, under the same ids.","Ignore a message of an older generation than the one held.","Route each event by its type. Handle every webhook_endpoint.reset the same way, whatever its reason: respond 2xx first, then reload in the background.","To reload: read the endpoint's filter and language as they are now (GET /v1/webhook-endpoints/{webhook_endpoint_id}). Read every page of /v1/feed with the selection the filter makes (its companies, markets, part_kinds and teasers, and the item kinds its event_types name), in that language. Read the pages again until they carry the same access_version.","While you read, keep applying the messages that follow by the same rules, and keep the event ids seen.","Then merge the read into the copy under the reset's generation. For each item read, keep what the copy holds of its subject at that generation at the same sequence or a later one, or at a newer generation: an event that arrived while you read. Otherwise store the item read. Then remove everything held from an older generation. If a newer reset arrives during the read, stop: its reload replaces this one. A reset the receiver stored but Quanor counted failed is sent again in the next generation, and replaces the first in the same way. A rewind raises the generation too but sends no reset, and a reload it overtakes goes on. Merged this way, the copy ends the same whatever order the pages and the messages came in. Keep each reload begun and not merged with the copy, and begin it again after a restart.","On a feed item's event (announcement.*, pre_earnings_analysis.*): an event of a newer generation wins over what you hold of its subject, whatever its sequence. Within a generation, apply an event only when its sequence is above what you hold of its subject — the item, or its tombstone — or equal to it and the event a removal, and ignore it otherwise: sequences of one subject compare as strings, and at the same sequence a removal wins. On updated, store data as the item, with the event's sequence; it may be the first event you receive about it. On withdrawn and hidden, remove the item and keep a tombstone: its subject and the event's sequence, until a reload of a later generation drops it — messages arrive in no promised order, and a reset's pages overlap the messages around them, so an older update arriving after a removal would otherwise bring the item back. data.changes is always empty: compare parts by part_id and part_version to learn what changed. data.op (new or changed) is a hint: new means the item's seq is its first_seq; decide nothing by it. A message holds a subject's events in their order; across subjects, it orders nothing.","On a feed item's event whose data is a refetch: read /v1/feed/items/{feed_item_id}, in the endpoint's lang, and apply what it answers at the event's generation and sequence (not the item's own), by the rule above, when its access_version is the copy's; a 404 under the copy's access_version removes the item at that sequence. Read it before applying the next message; one read in the background is kept with the copy, as a reload is, and its answer dropped when a reset of a newer generation arrived during the read: that reset's reload reads the item. An answer under another access_version, a 404 among them, means: read /v1/feed again; a 404 that carries none (a load balancer's) is a read that failed: try it again a few times, then read /v1/feed again.","The copy is held under the access_version of the message that began its reload: a reset's, or one under another access_version than the copy's, which means: read /v1/feed again, under the generation that message arrived at.","Keep, with the copy, the through of the last message of events applied on each track: after restoring the copy from a backup, rewind the track to it (POST /v1/webhook-endpoints/{webhook_endpoint_id}/tracks/{track}/rewind, since) — or, when the last message the copy took was a reset, read /v1/feed again. A rewind refused before_reset (the backup is no newer than the last reset) or cursor_not_in_epoch (older than a restore of the feed) means: read /v1/feed again. One refused cursor_ahead or reset_pending needs nothing: the messages that follow overlap the copy, or the reset that follows reads everything again.","A webhook_endpoint.tested event is a test: respond to it as to any message. Its data.example, when you named a type, is that type's example — never a change, and never sent as its type.","Ignore an event type, a track and a field version 1 does not name."]}