4 November 2026
Evidence packs name their key by its fingerprint
- Evidence packs and
GET /v1/evidence/public-keysname the signing key by its fingerprint,key_ref: the first 16 hexadecimal characters of the SHA-256 of the public key. It replaceskey_idin new packs; packs made before stay exactly as they were signed. See The key fingerprint. - The signing key stays in a hardware security module; a key attestation is available to auditors on request.
1 November 2026
Refused events are kept
- wede keeps every event it refuses with its full content as it arrived, the device, its number and the reason, as a record that cannot be changed. The result of a refused event in a sync says so with
recorded: true. See Refused events are kept. - New
GET /v1/sync/rejected: the refused events of your organisation with their content. In the dashboard, the new Refused page shows them. wede never sees their content. - New
POST /v1/sync/rejected: a device that kept refused events with an SDK before 2.17.0 hands them to wede only to be kept, never processed again.
SDKs 2.17.0 and wede edge node 1.7.0
- Every SDK keeps what it holds without network so that a long time offline never slows the device down, and works within the space the device has. With no space left it lets go only what it can download again, then refuses the new operation with
WedeStorageFull; nothing already kept is lost. NewstorageBudgetBytes,onStorage,storageUsageandstorageLevel. See Space on the device. - A refused event stays on the device until wede confirms it keeps its content; only then can your app clear it, and
clearRejectedEventssays how many it cleared and kept. - The wede edge node 1.7.0 runs on the SDK 2.17.0 and answers
507 storage_fullwhen it has no space left for an event it would accept by itself. - Both are in Downloads. Earlier versions keep working.
Value operations
- New wede parser model Value operations (
val) in every vertical except banking, for sales, transfers, purchases and refunds that are not ATM or POS. One per organisation; its typessale,transfer,purchaseandrefundare added to the catalog of every vertical of your organisation. See Value operations. - The value operation types of wede, these four and the ledger types of banking, always stay
ledgertypes without teams and cannot be deleted:PATCHorDELETEreturns409 value_type_fixed. Their name, description and category can change, and they can be deactivated. - An operation with an amount and no currency takes the currency of the country of your organisation, and an ISO 4217 number such as
978is read as its currency (EUR). Amounts are never converted.
31 October 2026
Fee on value
- For payments, transfers and other operations with an amount, wede can agree with your organisation a fee on the value of each operation, besides the fee per event, set for each operation type. It depends on the amount of each operation, as agreed in your contract. Only accepted production operations in the currency of your country pay it; amounts are never converted, and a reversal pays nothing. See Fee on value.
- It goes on the monthly invoice from November 2026, one line per operation type (
kind: value_fee), and counts infee_amount. GET /v1/tenant/monthly-invoicesreturnsvalue_fees: your fee on value by operation type. Billing in the dashboard shows it.- Without a fee on value agreed with your organisation, nothing changes.
29 October 2026
SDKs 2.12.0 and wede edge node 1.4.0: app tokens
- Apps can work through your organisation’s wede edge node with one of its app tokens, also while wede does not answer. Apps of your customers use the app token alone; apps of your staff use it next to the session of the person signed in. New option
edgeAppToken(edge_app_tokenin Python). See Working through your wede edge node. - Each device that registers through the node gets a key of its own, kept and sent by the SDK. What belongs to one device needs that key: its notices always, the rest when the app has no session.
- wede edge node 1.4.0 takes app tokens (
WEDE_EDGE_APP_TOKENS); its node token stays for operating the node. A node with no app tokens works as before. - Both are in Downloads. Apps that call wede directly need no change. Earlier versions keep working.
Manuals inside every package
- Since SDKs 2.11.1 and wede edge node 1.3.1, every package includes its complete manual (
MANUAL.md) and the manual of the wede API (API.md).
28 October 2026
SDKs 2.11.0 and wede edge node 1.3.0 in Downloads
- SDKs 2.11.0 for JavaScript and TypeScript, React Native, Python, Swift and Android are available in Downloads, with everything announced for 2.10.0: the offline queue goes most urgent first, the priority of your catalog is applied on the device, larger requests are compressed, and the notices to the person who made a request. See SDKs.
- wede edge node 1.3.0 is available in Downloads for organisations with access to it, with the notices given through the node while wede does not answer.
- Nothing changes in your code. Earlier versions keep working.
Notices through the edge node while wede does not answer
- With wede edge node 1.3.0, the app of the person who made a request gets its notices through the node even while wede does not answer, when the app and the teams that answer the request reach wede through the same node, with your texts. When wede answers again, it learns what the app already showed, so nothing is shown twice or sent again by SMS or voice. Nothing changes in your code. See Notices to the person who made a request.
POST /v1/devices/{device_id}/notices/ackalso takeskeys(request key and state), used by the edge node. See Notices for the app that made a request.event.requester_updatecarriesvia: "edge"for a state the edge node gave first.
SMS through the provider that delivers best
- With two or more SMS providers in your fallback order, wede now sends through the one that delivers best. It measures every SMS it hands to a provider from the delivery receipts (share delivered and time to the receipt, last 30 days); providers with at least 20 results swap places among themselves, and the others keep the place you gave them. The order of the channels stays yours and voice always runs last. wede never stores the number or the text of an SMS to measure it.
- On by default. Turn it off with the new
PATCH /v1/tenant/communications/settings(sms_measured_order), or in the Communications page of the dashboard.GET /v1/tenant/communicationsreturnsmeasuredandsend_orderfor each SMS provider. See SMS providers in the measured order.
Notices to the person who made a request
- Your organisation writes, per event type in its catalog, the text of the notice for each state of a request: received, dispatched, on route, on site (
requester_texts, one line of up to 160 characters; a state without text sends nothing). See Notices to the person who made the request. - The app that made the request gets each notice by the best channel it has: over the internet (new
GET /v1/devices/{device_id}/noticesandPOST /v1/devices/{device_id}/notices/ack), through your wede edge node, or without data by an encrypted SMS status request answered with one readable SMS per notice: your sender name, your text and a link to your app or a code. Every notice goes out in your organisation’s name. See Notices to the person who made a request. - New webhook
event.requester_update, never with a phone number.event.content_completedis now documented too. - New switch SMS notices to the people who make requests (
sms_requester_status, off by default). Only when it is on, wede keeps the number of a person who made a request by SMS, or who chose to share it in your app (requester: { phone, shared: true }onPOST /v1/eventsand in sync), encrypted and for that request only, until it is completed or closed. Turning it off removes every number kept. Review your privacy policy and terms before turning it on. - The link of these notices uses its own path,
/<link code>u. The iPhone file shown in Settings, Link in SMS already includes it; until your published file covers it, these notices go out with the code and the links for your teams keep working.
SDKs 2.11.0
- Every SDK reads and confirms the notices (
requesterNotices,ackRequesterNotices), asks for them by SMS without data (requesterStatusRequest) and reads the answer withopenMessage; the request can carry the number the person chose to share. See SDKs.
27 October 2026
Dashboard sessions in an HttpOnly cookie
- The wede dashboard now keeps its session in a cookie set by the API (
HttpOnly,Secure,SameSite=Strict), which scripts on the page cannot read. Only the wede dashboard addresses receive credentials in cross-origin responses, and requests that change data with that cookie need a header that only those addresses send. See Security. - Signing in to the dashboard with an API key is no longer possible: people sign in with email and password or single sign-on. API keys stay the credential of your servers.
- New
POST /v1/auth/logout, used by the dashboard to end its session. - Your integrations are unchanged:
POST /v1/auth/loginstill returns the token in the body, and API keys and session tokens keep working in their headers. - Sign-in, account creation, password recovery and token requests are also limited per address, so that one source cannot try passwords or create accounts without limit.
25 October 2026
Offline policy
- Write your own limits for operations your devices accept without network: for each operation type and currency, a maximum per operation and, optionally, a cumulative amount, a number of operations or both per device since its last sync. There is no limit of time without network, and a policy never expires. Without a policy, nothing changes. See Offline policy.
- wede checks every decision when the operations arrive and marks the ones that do not match, with the reason. It never refuses or delays an operation because of its decision.
- New
/v1/policies: the policy in use, versions that never change once saved, one in use at a time, and the decisions wede checked. New permissionspolicies:viewandpolicies:manage, for administrators, technical staff and API keys. - In the dashboard, the new Offline policy page writes versions, tries an operation against them and shows the decisions that did not match.
SDKs 2.9.0
- Every SDK fetches the offline policy after each sync with network, keeps it and applies it with no network. A refused operation is never queued:
captureEventthrowsWedePolicyDeclinedwith the rule. The optionwhenNoPolicychooses what a device that never received the policy does. See Your limits without network. - No change is needed in your code. Without a policy in use, operations are captured as before, and earlier versions keep working.
Offline policy in the proof kit
- The proof kit has a seventh check, Your offline policy: it passes when wede checked every decision your devices took with your policy in the window. Decisions that did not match are listed one by one as findings about your devices and never make the proof fail. The report carries
offline_policy. See Proof kit. POST /v1/policiesaccepts only operation types that are active in your catalog. A type that exists but is turned off returns422 unknown_operation_type, now withinactivelisting it.
Proof kit in the sandbox
- Prove continuity with your own equipment: open a proof run in the sandbox, run your devices with your sandbox key (capture without network, out of order, a batch sent again, an altered message, your own records) and finish it. The report (
wede-proof/1) says whether anything was lost, stored twice or accepted altered, check by check; a check you did not exercise is never reported as passed. It is sealed with the SHA-256 of its canonical JSON and never changes. See Proof kit and Proof runs. - In the dashboard, the new Proof kit page opens and finishes runs and shows the report, with the JSON to download.
Integrity incidents in the sandbox
- An event sent with a sandbox key whose checksum does not match is still refused and recorded as an integrity incident, marked as sandbox, but no alert email is sent and no personal data incident is opened. Production is unchanged. See Integrity incidents.
Evidence packs by zone
- Integrity incidents now carry the zone of their event. A pack for a zone holds the incidents of that zone and those without a zone, marked
zone_code: null; never those of another zone. See Integrity incidents and zones.
Messages in English
- Two error messages that were still in Portuguese are now in English:
Missing X-Wede-API-Key header.andToken expired(offline tokens). Theerrorcodes are unchanged.
24 October 2026
Plans and the monthly invoice
- Every plan now includes users, devices, zones, webhooks and data sources (empty means unlimited), production events per year and communications per year, and may have a fee per production event. wede can agree conditions of its own with your organisation for any plan. See Plans.
- What goes above your plan never stops your operations and is charged apart, on one invoice a month: communications through wede above what the plan includes (since October 2026), each unit above the plan for each day it was above, production events above the yearly limit at a price per event, and the fee per production event when your plan has one (all three since November 2026). A month below 0.50 in your currency goes on the next invoice. The yearly licence is invoiced on its own, as before. See The monthly invoice.
- Billing suggests the next plan by price when what was charged above your plan in the last month costs more than the monthly difference to that plan.
- New
GET /v1/tenant/plans: every plan offered to your organisation with your conditions. NewGET /v1/tenant/monthly-invoices: your monthly invoices, line by line, and the upgrade suggestion. GET /v1/tenant/billing:usage.overage_eventsis measured against the yearly limit agreed with your organisation, else the plan’s.usage.overage_amount_euris deprecated and always0;channel_costscarries your price with your discount (price_per_unit,country_price,discount_pct).
Parsers
- A parser model always keeps one active version. The active version cannot be archived (
DELETE /v1/parsers/{id}) or turned off (PATCHwithis_active: false): both return409 active_version_required. Make another version of the model active first; the previous one can then be archived. See Update a parser.
SDKs: minimum supported version
- The minimum supported version of every SDK is 2.4.0. Older copies are refused on the routes only the SDKs use, with
403 sdk_version_unsupported. See Minimum supported version.
23 October 2026
How usage is counted
- Every production event counts once toward your yearly allowance, when it is created, whether it is delivered or not.
- Communications are counted the way the providers charge them, when they are sent: each SMS segment to each recipient, each started minute of a call, each satellite or LoRa message. Only what goes through a provider of wede is taken from your plan and charged. What goes through your own providers, and what your organisation receives, is counted and never charged. See What wede counts.
GET /v1/tenant/usagereturnscommunications_year: each channel bought from wede with the units used and included this year. See Usage.
Communications above the plan
- Communications through wede above what your plan includes are invoiced every month, from October 2026. What went above the plan before 1 October 2026 is never invoiced.
GET /v1/tenant/communicationsreturnsinvoicedper channel: units and amount already invoiced this year, andwaived_units. See Communications.
Licence notices
- The administrators of your organisation get an email 30, 7 and 1 days before your licence ends, when it ends and when it becomes inactive, each once. See Licence notices.
Teams
PATCH /v1/teams/{id}withzone_id: nullremoves the team from its home zone.
22 October 2026
Dispatch threshold
- The default
dispatch_thresholdis now0.70. Organisations that were still on the previous default0.30moved to0.70; any other value you chose is unchanged. The threshold still never stops a dispatch: it only marks a missionbelow_threshold. - The dashboard offers three levels:
0.80(strict),0.70(standard) and0.55(permissive). Any value from 0 to 1 can still be set withPATCH /v1/tenant/dispatch-settings. GET /v1/tenant/mereturnsdispatch_thresholdas a number instead of a decimal string. See Automatic dispatch.reinforcement_timeout_minaccepts a whole number from 0 to 60; a higher value returns400 validation_error.
Teams
DELETE /v1/teams/:iddeletes only a team that was never sent on a mission. A team with missions is kept as their history and the call returns409 team_has_missions; set it unavailable instead.
SLA alerts
- When WEBHOOK is an alert channel of the SLA of a vertical, wede sends
sla.violatedonce per mission that passes the response target of its priority, andsla.uptime_below_targetat most once a month when the availability of the API that month is below the uptime target. See Webhook events. - The alert channels of an SLA are EMAIL and WEBHOOK; push and voice were removed.
Usage
GET /v1/tenant/usagereturnsby_vertical, the production events of the period in each vertical (it was always empty). The included quantities inlimitsare the ones agreed with your organisation when they differ from the plan.
Privacy Policy and Terms of Service, version 2.0
- The Privacy Policy now describes wede as processor for your organisation’s data and as controller for its own customer relationships, the retention periods per vertical, user deletion, incident notification under Article 33(2) GDPR, the full list of sub-processors and what the dashboard keeps in the browser.
- The Terms of Service now describe what happens when a licence ends (the account is degraded, never switched off), that usage above the plan never stops the service, and the offline and channel commitments as they work today.
app.wede.pt/privacyandapp.wede.pt/termsopen these pages.- A one-off
destinationis kept encrypted with your organisation’s key while a delivery over the fallback channels runs, and removed when it ends. It is never kept with the event.
20 October 2026
SDKs 2.8.0
- The SDKs send a field team’s reply by SMS for you when there is no data connection: on iPhone and on Android without the SMS permission they open the messaging app with the reply written, and on Android with the permission they send it with no tap. See Field teams’ replies by SMS.
17 October 2026
Reconciliation: decisions, daily closing, view by device
POST /v1/reconciliation/resolutionsrecords what your organisation decided about an operation or a record that did not reconcile:accepted_as_captured,corrected_in_client_books,reversed,written_off,under_investigationorother(with a note). One, or up to 500 per request with one result per decision. The operation never changes; the history is kept and the latest decision counts.GET /v1/reconciliation/resolutionsreturns the history. Operations, records and the view show the latest decision, and operations can be filtered byresolution. See Your decisions.POST /v1/reconciliation/sources/{source_id}/closescloses a day of a source with your totals per currency and direction, in your time zone; the day isclosedordifference, with each difference.GETlists the latest closing of each day, what wede counts now and the days not closed yet. See Closing each day.GET /v1/reconciliation/devices: each device with its operations by state, decisions and whether everything it sent has arrived.- New webhooks
reconciliation.resolvedandreconciliation.period_closed. - In the dashboard, Reconciliation has Resolve on every operation and record not confirmed, Daily closing and By device.
SDKs 2.7.0
- Every SDK records decisions (one, or any number: 500 per request, in order), reads their history, closes days, reads closings and reads the view by device. No change is needed in your code. Earlier versions keep working.
SDKs 2.6.0: ledger and reconciliation
- Every SDK can read the operation ledger and work with reconciliation: create and change sources, send your records, read the outcome of each record, the summary, the view by equipment and by day or hour, and the operations behind it. See Operation types and the ledger and Reconciliation.
- Sending records takes any number of them: the SDK sends 500 per request, in order, and returns one outcome per record with the totals. A record already received is reported as
duplicate_externaland never counted twice, so sending again after an error is safe. - Android SDK on the JVM (outside Android): requests with
PATCHnow work. The JVM’sHttpURLConnectionrefuses that method, so they go throughjava.net.http. Android is unchanged. - No change is needed in your code. Earlier versions keep working.
Usage
GET /v1/tenant/usagealso returnsby_day, the events of each UTC day of the period (periods of up to 92 days), andyear_to_date, the production events since 1 January (UTC), which is what the yearly allowance of your plan is measured against.
Deleting users
- A company admin can now delete the accounts of their organisation. The account is blocked and every session ends at once; 30 days later the name, email and password are removed for good. Until then the deletion can be undone, and the account comes back suspended. Nobody can delete their own account or the emergency account of single sign-on.
16 October 2026
Evidence packs, format 2
- New packs are
wede-evidence/2: people and devices appear as codes of the pack (P1,D1), never as their ids. The key to the codes is kept by wede only, read only by the wede team and recorded in the audit log each time, and anonymised at the end of the evidence period. Packs in format 1 stay as they were signed. See Codes for people and devices.
15 October 2026
Continuity evidence packs
POST /v1/compliance/evidenceproduces a signed record of a time window of up to 92 days: every period offline or degraded and how long it lasted, who or what changed each state, every synchronisation that came afterwards with the result of each item, events by ingest channel and integrity incidents. No business content.- Packs are signed with ECDSA P-256 by a key held in a hardware security module. The public keys are published at
GET /v1/evidence/public-keys, so an auditor can check a pack with openssl without wede. Packs can never be changed or removed. See Continuity evidence packs. - In the dashboard, Compliance has a new Evidence Packs tab to generate and download packs.
Continuity record
- Every change of state of a zone or of the organisation now opens a period that is kept for good. Periods before 15 October 2026 were rebuilt from the audit log and are marked as reconstructed.
- Every event records the channel it came through (
api,sync,offline_dispatch,sms,satellite,lora,other), and every synchronisation records the result of each item, duplicates included.
Compliance report
offline_synccountsfailedandblocked_integrityper day.GET /v1/compliance/report/exportreturns the report as a file directly, without a redirect.
14 October 2026
Single sign-on with SAML 2.0
- Besides OpenID Connect, an organisation can now use SAML 2.0 for single sign-on, with its own Entity ID, reply address and metadata under
https://api.wede.pt/v1/auth/sso/saml/<organisation id>. Assertions must be signed; up to 3 signing certificates, for rotation. Only sign-ins started by wede are accepted: a tile in your provider portal uses the Sign-on address. See Single sign-on. - Every single sign-on, OpenID Connect or SAML, now completes only in the browser tab where it started. A sign-in link opened in another browser is refused and recorded as
browser_mismatch.
Provisioning with SCIM 2.0
- Your directory can create accounts, change their role by group and suspend them at
https://api.wede.pt/scim/v2, with awscim_token. See Provisioning (SCIM).
Security export to your SIEM
GET /v1/security-events?after=<n>returns the security record of your organisation in order, with awsec_token, and wede can also push it every minute to up to 3httpsaddresses, signed like webhooks. See Security export (SIEM).
13 October 2026
Single sign-on with OpenID Connect
- An organisation can sign in to the dashboard through its own identity provider over OpenID Connect, with verified email domains, roles from groups and an option to require single sign-on for everyone except an emergency account. See Single sign-on.
SDKs 2.5.0
- Every operation captured offline carries the identity of the device and its place in the device’s own numbering, sealed on the device. The device’s completeness appears on the Devices page like any other machine. See SDKs.
- The device registers itself before it sends its first operations, so every operation is attributed to it from the start.
- The event metadata types include the device and capture time fields, for integrations that send from their own hardware.
- No change is needed in your code. Earlier versions keep working.
Mappings: connect equipment without code
- A mapping says which field of the messages a device or system already sends fills each field of a wede operation. Messages are then sent as they are to
POST /v1/ingest/{code}, as JSON or CSV (text/csv), up to 500 per request, with a result per message (accepted,duplicate,rejectedwith the field and the reason). Each message follows the same path asPOST /v1/events. See Mappings. - Only the mapped fields enter wede. Mappings have versions that never change once saved; one is in use at a time.
POST /v1/mappings/previewtries a mapping on sample messages without storing anything. - New permissions
mappings:viewandmappings:manage, for the organisation’s administrators, technical staff and integration keys.
Capture time on online events
POST /v1/eventsaccepts an optionalmetadata.captured_at, the time the device captured the operation. It becomes the capture time of the operation, used to match your records by time.
Parser models
- Every factory parser model now has a field for the equipment that captured the event (
device_refwhere there was none). It is not sent by SMS by default and not shown to field teams. Parsers you already have are unchanged. - The model for ATM and POS terminals has
original_stan, to tie a reversal to its original operation. It is off the SMS by default, so the model still fits one SMS; you can turn it on in your parser.
12 October 2026
Proof that nothing is missing, per device
- For each device that numbers what it sends, wede shows what arrived, what is missing and since when, what arrived late, duplicates refused, restarts of its counter and whether its record is intact. On the Devices page and with
GET /v1/devices/{device_id}/completeness. See Devices.
Quantities and units
- Operations and your records can carry a quantity and its unit as captured, never converted. Reconciliation matches by quantity in the same unit, with the new reasons
quantity_mismatchandunit_mismatch. See Reconciliation.
Currencies
- Amounts sent in decimal are converted with the decimals of their own currency (none for JPY, three for KWD), instead of always two.
Reconciliation and reversals
- Your own records are matched against every operation wede carried, by type of equipment and by day or hour, with fixed outcomes and reasons and signed webhooks. A reversal is tied to the operation it reverses, whichever arrives first. See Reconciliation.
National phone numbers
- Phone numbers sent to wede can now be written as a national number of your organisation’s country, with or without spaces, as well as in international form (
+or00, then the country code and number). wede checks that a national number is valid for your country and stores it in international form. This applies to team device numbers and SMS recipients. A number that is neither valid for your country nor international returns400 validation_error. - The one-off
destination.phoneof an event is unchanged and still takes the international form.
10 October 2026
What a field team sees
- A
field_operatorsession now receives an event (GET /v1/events/:event_id) with the payload reduced to the fields marked Show to team in the parser the event was written with; keys outside the parser never reach the team, andmetadatais reduced to zone, location, parser reference and offline origin. The response carriespayload_filtered: true, andfilter_reason: no_parserwhen the vertical has no parser (then the payload is withheld until a parser is active). The other tenant roles are unchanged. labelsnext topayloadinGET /v1/events/:event_idand in theevent.createdwebhook: the label of each parser field and, for enumerated fields, the label of the chosen option. The codes inpayloadnever change.- Missions created by wede carry a snapshot of the Show to team fields in
payload, withlabels, so the team keeps the data while the mission lasts; it is cleared when the mission ends.GET /v1/missions/myandGET /v1/missions/:idalso returnevent_teams: every team called to the same event with its role and state, never its members. - Payload retention: an event whose type sends a team keeps its payload until it is closed or its missions end, instead of losing it at delivery. Types that do not send a team are unchanged (cleared at delivery).
- For an event sent over the API with several active parser models in its vertical, wede uses the model whose type field maps to the event type.
GET /v1/parsersitems carrysms_size.segments_at_version_100andsms_size.grows_at_version_100: from version 100 the version number takes one more character, so a model at the 95-byte limit will need a second SMS. The dashboard shows the warning on the model.
8 October 2026
One catalog per organisation
- An event’s
typeis now always an active event type of your catalog for the event’s vertical. The wede categories (EMERGENCY,PAYMENT,BOOKING,STATUS_UPDATE,IDENTITY_CONFIRM,DISPATCH,OTHER) are no longer accepted as atype. Any other value returns422 unknown_event_type, now withknown_typeslisting the accepted codes. - The catalog is organised by vertical, category and event type. wede pre-loads a starting catalog for every vertical of your organisation; administrators keep what fits, add their own types, deactivate or delete the rest, and restore the defaults at any time. Types that already existed were kept, with their coverage.
- Each type says whether it sends a field team (
requires_teams), which equipment and qualifications resolve it (required_equipment, codes of your own equipment list) and its default priority.priorityis now optional onPOST /v1/events: without it, the type’s default applies (normalwhen it has none). GET /v1/catalogreturns the catalog with the team coverage of each type;GET /v1/catalog/equipmentreturns your equipment and qualifications.GET /v1/catalog/actionsandGET /v1/event-categoriesare deprecated: the first still lists your types, the second returns an empty list. Both will be removed.GET /v1/eventsitems carrycategory(the code of your catalog category),category_nameandrequires_teams;dispatchablekeeps the same value asrequires_teams. Thecategoryfilter takes a category code of your catalog;legacy_type=truelists open events sent before this change with a type that is not in your catalog.GET /v1/events/:event_idcarriesevent_type_idandrequires_teams.POST /v1/eventsand theevent.createdwebhook carrydispatch.status(queued,manual,not_dispatchablewithreason: type_does_not_require_teams,off,sandbox); the webhook also carriescategoryandrequires_teams.- Each value of a parser’s type field points to a type of your catalog. A parser cannot be activated while one of its values points to a type that does not exist (
422 parser_type_missing).
Dispatch by coverage
- Only events whose type sends a team enter the dispatch queue (
GET /v1/events?undispatched=true). - Teams cover a whole category or specific types (
GETandPUT /v1/teams/:id/coverage). Candidates are the teams of the vertical that cover the event’s type (tier 1) or its category (tier 2); the others appear inexcludedwithreason: no_coverage. Tier 3 is always empty. - A team without members is never a candidate (
excludedwithreason: no_members); dispatching it by hand returns409 team_has_no_members. - The equipment a type calls for counts in the score and is reported per team as
missing_equipment; it never excludes a team. A manual dispatch of a team that does not cover the type or lacks equipment still happens, withwarningsin the response and in theteam.dispatchedwebhook. POST /v1/teams/dispatch/scorewithevent_idranks by coverage (by_coverage: true,event_type,required_equipment,tierandmissing_equipmentper team).- A team’s equipment is chosen from your equipment list:
POST /v1/teams/:id/equipmenttakes acodeof that list (422 unknown_equipmentotherwise). Team members carryuser_idwhen linked to an account. - Automatic dispatch takes the best tier 1 team, or the best tier 2 team when none covers the type itself, and never waits for ideal conditions: a team below
dispatch_thresholdis dispatched and the mission is markedbelow_threshold.
SDKs 2.4.1
- Live events (
listLiveEvents), continuity state (getContinuity), reinforcement requests (list and fulfil), sandbox connectivity simulation,listEventswithcategory,undispatchedand cursor pagination, and webhook signature verification in every SDK (verifyWebhookSignature, withsignWebhookBodyfor tests). Available from Downloads in the dashboard.
7 October 2026
SDKs 2.4.0
- The wede SDKs for JavaScript and TypeScript, React Native, Python, Swift and Android are now distributed privately to customers under agreement, from Downloads in the wede dashboard. See SDKs.
- Offline layer with automatic synchronisation when the connection returns, messages to field teams when there is no data connection and their replies, device registration and removal.
- Each download is a unique copy for your organisation.
- The public 2.0.0 packages (npm, PyPI, GitHub and JitPack) have been withdrawn.
27 September 2026
Event status is the delivery status
- An event becomes
completedas soon as it is delivered: online (rest_fullorrest_compressed), through any channel of your cascade, or reconciled from the store-and-forward queue. Events accepted by sync follow the same rule once delivered, and so do simulated deliveries in the sandbox. pendingnow means only that the event is queued (queued_offline) or not delivered yet.- The stored payload is cleared whenever an event becomes
completed, including online deliveries. - The
event.deliveredwebhook now carries"status": "completed". - A mission outcome no longer changes the status of its event, and no longer sends
event.status_changed. Follow missions withmission.status_updated.
Dispatch queue
GET /v1/events?undispatched=truereturns the events without an active mission (no mission, or only missions that endedFAILED).
Core and optional module
- The core that every integration uses is events, delivery through your channel cascade, offline capture and sync, and webhooks. Teams, dispatch and missions are an optional module for operational verticals such as emergency services, healthcare field teams, field services and delivery.
Zones
- Reading zones needs
zones:view, which the integration API key and every tenant role have. Creating, updating and deleting zones needszones:manage(company_admin,company_tech,country_admin). - Creating a zone whose
zone_codealready exists returns409 zone_code_taken. - On a zone shared with another tenant, you can change only its state and active verticals: changing
name,region, the centre orboundaryreturns403 shared_zone. - A
connectivity_statechange made with a sandbox key only affects the sandbox. - Connectivity reports and
metadata.zone_idon events only resolve zones linked to your tenant. A report on another tenant’s zone returns422 invalid_reference; an event with another tenant’s zone code is stored without a zone.
Rate limits
- API key requests are limited per tenant and per minute (your tenant or plan limit, 500 by default).
- Every API key response carries
x-ratelimit-limit,x-ratelimit-remainingandx-ratelimit-reset. Above the limit, wede returns429 rate_limitedwithRetry-Afterand the body fieldslimitandretry_after_seconds.
Tenant isolation for teams and missions
- A team, member, event or mission of another tenant returns
404:not_found, orteam_not_found/event_not_foundonPOST /v1/teams/dispatch, andteam_not_foundonPOST /v1/missions. POST /v1/teams/dispatchrequires an existing production event of your tenant.
Mission lifecycle
- A mission’s status only moves forward and can skip steps.
FAILEDcan be set from any status that is not final;COMPLETEDandFAILEDare final. Any other change returns409 invalid_transition. - Users with only
missions:receive(field_operator) can update only missions of their own team (403 forbiddenotherwise), and only their own member location. GET /v1/missions/myreturns the missions of every team the signed-in user is a member of (up to 50).field_operatorcan now register and sync devices (sdk:access) and read zones (zones:view).
Substitution instead of reinforcement
- When a mission is not acknowledged within
reinforcement_timeout_min, wede sets it toFAILEDwith"feedback": { "reason": "no_acknowledgement" }, frees its team and dispatches the best free team not yet called for that event. - The new dispatch sends
team.dispatchedwithsubstitution: true,mission_id,replaced_team_idandreplaced_mission_id. The previousreinforcementandoriginal_team_idfields are no longer sent. - If no team is free, the event returns to the dispatch queue.
Team ranking
- Zone boundaries now count when wede ranks teams: a team whose zone boundary does not contain the event ranks lower. It is not excluded.
Usage beyond the allowance
- A tenant is never suspended for exceeding its annual event allowance. Operations continue and the excess is reported as
overage_eventsin theusageobject ofGET /v1/tenant/billing. - Usage alerts are sent when 50, 40, 30, 20, 10 and 0 percent of the allowance remains, each at most once per year.
Webhooks and browsers
- Webhook URLs must use
https; any other URL returns400 invalid_payload. - The API accepts cross-origin requests from any origin. It authenticates only by headers, so the JavaScript SDK works in browsers with a session token. Never put an API key in a browser.
26 September 2026
SDKs 2.0.0
Four official SDKs, all at version 2.0.0, under new package names:- Session-token support: sign a user in with
WedeClient.loginand use the token in apps and browsers, where an API key must never be shipped. - Offline capture with checksum:
captureEvent(capture_eventin Python) records the capture time and the integrity checksum, andsyncBatchsends up to 500 captured events at once. - 2.0.0 is a new major version. See SDKs for the current methods.
Event types
- An event’s
typeis now either an active event type of your tenant’s catalog for the event’s vertical (for examplecardiac_arrest) or an active wede category (EMERGENCY,PAYMENT,BOOKING,STATUS_UPDATE,IDENTITY_CONFIRM,DISPATCH,OTHER). - Each catalog event type is linked to a wede category, and every event stores its category when it is received.
GET /v1/event-categorieslists the categories.GET /v1/catalog/actionslists your event types.- Any other
typereturns422 unknown_event_type, online and in sync batches.
API key integration scope
- An API key now authenticates as an integration credential that covers the full integration cycle: send, list and read events, sync, manage webhooks, read event types, read and report connectivity, and read billing.
- Teams, dispatch, missions, users, API keys and catalog entries need a user session with the right role. See Authentication.
Sync
- Events accepted in
POST /v1/sync/batchnow follow exactly the same delivery path as online events. - Each accepted event sends an
event.createdwebhook with"origin": "sync", and every batch sends async.completedwebhook with its summary.
Webhooks
- Every subscribable webhook event now fires:
event.created,event.status_changed,event.delivered,event.failed,sync.completed,device.synced,connectivity.degraded,connectivity.restored, theteam.*events,mission.createdandmission.status_updated. - Verifiable signatures:
X-Wede-Signature: t=<unix seconds>,v1=<hex>, wherev1is the HMAC-SHA256 of<t>.<raw body>with the secret you set when creating the webhook. - Webhooks created before 26 September 2026 must be recreated to receive the new signature.
POST /v1/webhooks/:webhook_id/testnow sends a real signedwebhook.testdelivery to your endpoint and returns the outcome:success,response_status,response_time_msanderror.
Sandbox
wede_test_keys now work against a real sandbox. Events are stored with"environment": "sandbox", delivery is simulated with the same channel decision as production, nothing reaches a real recipient and nothing counts toward usage or billing.POST /v1/sandbox/simulate-connectivitysimulates a zone’s connectivity state for a limited time, in the sandbox only.
Events
GET /v1/eventsnow paginates with a cursor: pass thenext_cursorof one page ascursorto get the next.limitdefaults to 50, maximum 200.
v1.2.0: 9 June 2026
Device sync
POST /v1/devices/register: register a device with a permanent device IDPOST /v1/devices/sync: sync a device’s dispatch queue, idempotent per device and sequence numberGET /v1/devices/:device_id/queue: pending queue of a device
Dispatch settings
PATCH /v1/tenant/dispatch-settings: configure automatic dispatchdispatch_mode: turn automatic dispatch on or offdispatch_threshold: minimum ranking for automatic dispatch, between 0 and 1reinforcement_timeout_min: minutes before a backup team is dispatched when the first team has not acknowledged (0 turns it off)
Missions
- Mission lifecycle:
CREATED,SENT,ACK,ON_ROUTE,ON_SITE, thenCOMPLETEDorFAILED COMPLETEDandFAILEDclose the originating event and return the team toavailable- Field operators can update mission status
- Backup dispatch: send a different team to the same event with
POST /v1/teams/dispatchand the sameevent_id
Dispatch
event_latandevent_lngare optionalrequires_manual: trueis returned when automatic dispatch is on and no team reaches the threshold- Automatic reinforcement when a mission is not acknowledged within
reinforcement_timeout_min
SDKs 1.2
The previous SDK packages were updated withrequestBackup and updateDispatchSettings, and a new Android SDK was added under the previous name wede-sdk-android.
v1.1.0: 27 May 2026
Teams and dispatch
GET /v1/teams: list teamsGET /v1/teams/:id: team detailPATCH /v1/teams/:id/members/:memberId/location: update a member’s locationPOST /v1/teams/dispatch/score: rank teams for an eventPOST /v1/teams/dispatch: dispatch a team to an event
Missions
GET /v1/missions: list missions, filtered by team, status and limitGET /v1/missions/:id: mission detailPATCH /v1/missions/:id/status: update a mission’s status, with optional feedback
Billing
GET /v1/tenant/billing: current plan, annual usage and available plans
API key management
GET /v1/tenant/api-keys: list active API keys (prefix only)POST /v1/tenant/api-keys/rotate: rotate an API key with a grace period during which the previous key stays valid
Security
- Five consecutive failed sign-in attempts lock the account for 15 minutes
- Session tokens are invalidated at once when a user is suspended or the session is revoked
SDKs 1.1
The previous SDK packages were updated with teams, dispatch, missions and billing methods. Previous names:@wede/sdk (JavaScript and TypeScript), wede-sdk (Python), @wede/react-native-sdk (React Native) and WedeSDK (Swift).
v1.0.0: May 2026
Core platform
POST /v1/events: submit eventsGET /v1/events: list eventsPOST /v1/sync/batch: sync events captured offlineGET /v1/sync/status: sync totals for your tenantGET /v1/connectivity/status: zone connectivity statePOST /v1/connectivity/report: report connectivity from a field deviceGET /v1/tenant/zones: list zonesGET /v1/parsers: list parsersGET /v1/tenant/me: tenant informationGET /v1/tenant/usage: usage by periodPOST /v1/webhooks,GET /v1/webhooks,DELETE /v1/webhooks/:webhook_id: manage webhooks
Authentication
POST /v1/auth/login: sign in with email and password and receive a session tokenPOST /v1/auth/forgot-password: request a password resetPOST /v1/auth/reset-password: reset a password with a tokenPOST /v1/auth/change-password: change the password of the signed-in userPOST /v1/auth/verify: verify an account activation token
Security
- Rate limiting per tenant
SDKs 1.0
First SDKs, under the previous names@wede/sdk (JavaScript and TypeScript), wede-sdk (Python), @wede/react-native-sdk (React Native) and WedeSDK (Swift).