Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/prewave-exposure-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: Public Prewave Actions Exposure API
description: 'Documentation of the Public Prewave API.
## What''s New
### Q1 2026 — Supplier Management, User Management, Actions and Feed
This quarter introduces major v2 upgrades, expanded administrative capabilities, and the new Actions API.
- **Core Releases:** Deployed Supplier Management API v2 and Feed API v2, alongside the all-new Actions API.
- **Enhanced Functionality:** Added robust identifier management, granular user and role configuration, and endpoints for managing supplier connection contacts.
- ⚠️ **Required Migration:** Legacy v1 endpoints for Suppliers and Sites Upsert have been deprecated. Developers must migrate existing integrations to v2 by **May 31, 2027** (original deadline was December 31, 2026).
📖 **[Read the Q1 2026 changelog](https://docs.prewave.com/en/articles/699847-q1-2026-public-api-updates)**
### Q2 2026 — Supplier Screening and External Scores
We have expanded our v2 documentation to include comprehensive integration guidance for supplier screening and validation workflows and identifier-based external score ingestion.
- **New Capabilities:** Added support for optional post-onboarding screening and validation during the create event.
- **External Scores:** Batch POST for multiple supplier sites, per-site history GET, and event-type discovery GET (`/public/v1/scores/externals` and `/public/v1/scores/externals/event-types`). Documented in OpenAPI when enabled for your organization.
- **Developer Resources:** Published new integration examples and detailed identifier validation rules to streamline your implementation process.
📖 **[Read the Q2 2026 changelog](https://docs.prewave.com/en/articles/699849-q2-2026-public-api-updates)**
### Q3 2026 — Scores Webhooks
To support event-driven architectures and eliminate the need for continuous API polling, we are introducing webhooks for score state changes later this year.
- **Event-Driven Architecture:** Register webhook URLs to receive real-time HTTP payloads whenever a supplier''s score updates, so you can drive immediate mitigation responses without polling the API.
- **Availability:** Comprehensive OpenAPI specifications and payload schemas will be published closer to the release date.
- **Note:** Schemas and behaviors are subject to refinement prior to general availability.
Documentation updates will be provided prior to release.
### Q4 2026 — Feed V2
We are enhancing Feed API v2 with additional capabilities on top of the existing `GET /public/v2/feed` contract (see Q1 changelog and OpenAPI for the current Feed v2 integration).
- **Availability:** Details will be announced before release.
- **Note:** Schemas and behaviors are subject to refinement prior to the official release.
Documentation updates will be provided prior to release.
---
## Authentication
Prewave’s public api uses *API tokens* to authenticate against our RESTful service. We’ll provide you an *API-token* that each
endpoint needs present as a http header.
To pass the token in a request, simply add it as a header-parameter with
* key = X-Auth-Token
* value = api-token
See an example in curl below where the api-token would be 12345678-90ab-cdef-1234-567890abcdef
```
curl --request GET \
--url https://REPLACE_WITH_SERVER/public/v1/target/prewave/3975230/alerts \
--header ''X-Auth-Token: 12345678-90ab-cdef-1234-567890abcdef''
```
---
## Manage API Tokens
Before you can obtain your API token, you''ll need the credentials for your API user. These credentials will be
sent to you as part of the company-onboarding. If you haven''t got your credentials yet, please reach out to
your sales-contact at Prewave or contact us via info@prewave.ai
To generate an API Token, navigate to https://www.prewave.com/management/api and log in with the
credentials of your API user. Then click at the button "Create New" and use your new api-token authentication as a header parameter.
You can create multiple API tokens and also remove existing API tokens on https://www.prewave.com/management/api.
API tokens do not expire, therefore you have to maintain the list of API tokens you are using manually.
---
## Default Rate Limits
We have two types of default rate limits. For increased access, please contact customer success.
| Type | Requests per 10 seconds | Requests per Minute |
|-----------------------------------|-------------------------|---------------------|
| GET requests | 100 | 500 |
| POST, PUT, PATCH, DELETE requests | 20 | 100 |
'
version: '1.0'
servers:
- url: https://api.prewave.com
description: Production Environment
security:
- Token authentication: []
tags:
- name: Exposure
description: Get exposure analysis graph and targets
paths:
/public/v1/alpha/exposure/target/{targetId}/graph:
put:
tags:
- Exposure
summary: Get exposure graph by target id
description: '**Performance impact**: Medium'
operationId: getExposureGraphByTargetId
parameters:
- name: targetId
in: path
required: true
schema:
type: integer
format: int32
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BaseExposurePayload'
required: true
responses:
'200':
description: OK
content:
'*/*':
schema:
$ref: '#/components/schemas/ExplorerGraph'
'403':
description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
content:
application/json:
schema:
$ref: '#/components/schemas/AccessDeniedErrorDTO'
examples:
Access denied example:
summary: User lacks necessary permissions or authentication
value: "{\n \"loggedIn\": true,\n \"code\": \"access_denied\",\n \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n \"solution\": \"Contact support for appropriate permissions\"\n }"
'500':
description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDTO'
examples:
Error - Server Error:
summary: Unexpected server error
value: "{\n \"code\": \"internal_error\",\n \"message\": \"An unexpected error occurred\",\n \"solution\": \"Please try again later or contact support\"\n }"
'429':
description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiRateLimitResponse'
examples:
Rate limit exceeded example:
summary: API rate limit exceeded
value: "{\n \"error\": \"API rate limit exceeded\",\n \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n \"requestLimit\": 20,\n \"requestCount\": 20,\n \"limits\": [\n {\n \"requestLimit\": 20,\n \"timeInSeconds\": 10\n },\n {\n \"requestLimit\": 100,\n \"timeInSeconds\": 60\n }\n ],\n \"currentTime\": \"2026-01-15T10:30:00\",\n \"nextResetAt\": \"2026-01-15T10:30:10\"\n }"
/public/v1/alpha/exposure/target/{systemId}/{targetId}/graph:
put:
tags:
- Exposure
summary: Get exposure graph by foreign system target id
description: '**Performance impact**: Medium'
operationId: getExposureGraphByForeignSystemTargetId
parameters:
- name: systemId
in: path
required: true
schema:
type: string
- name: targetId
in: path
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/BaseExposurePayload'
required: true
responses:
'200':
description: OK
content:
'*/*':
schema:
$ref: '#/components/schemas/ExplorerGraph'
'403':
description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
content:
application/json:
schema:
$ref: '#/components/schemas/AccessDeniedErrorDTO'
examples:
Access denied example:
summary: User lacks necessary permissions or authentication
value: "{\n \"loggedIn\": true,\n \"code\": \"access_denied\",\n \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n \"solution\": \"Contact support for appropriate permissions\"\n }"
'500':
description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDTO'
examples:
Error - Server Error:
summary: Unexpected server error
value: "{\n \"code\": \"internal_error\",\n \"message\": \"An unexpected error occurred\",\n \"solution\": \"Please try again later or contact support\"\n }"
'429':
description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiRateLimitResponse'
examples:
Rate limit exceeded example:
summary: API rate limit exceeded
value: "{\n \"error\": \"API rate limit exceeded\",\n \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n \"requestLimit\": 20,\n \"requestCount\": 20,\n \"limits\": [\n {\n \"requestLimit\": 20,\n \"timeInSeconds\": 10\n },\n {\n \"requestLimit\": 100,\n \"timeInSeconds\": 60\n }\n ],\n \"currentTime\": \"2026-01-15T10:30:00\",\n \"nextResetAt\": \"2026-01-15T10:30:10\"\n }"
/public/v1/alpha/exposure/{id}:
get:
tags:
- Exposure
summary: Get exposure analysis info by exposure analysis id
description: '**Performance impact**: Medium'
operationId: getExposureAnalysisById
parameters:
- name: id
in: path
required: true
schema:
type: integer
format: int32
responses:
'200':
description: OK
content:
'*/*':
schema:
$ref: '#/components/schemas/ExposureAnalysis'
'403':
description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
content:
application/json:
schema:
$ref: '#/components/schemas/AccessDeniedErrorDTO'
examples:
Access denied example:
summary: User lacks necessary permissions or authentication
value: "{\n \"loggedIn\": true,\n \"code\": \"access_denied\",\n \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n \"solution\": \"Contact support for appropriate permissions\"\n }"
'500':
description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDTO'
examples:
Error - Server Error:
summary: Unexpected server error
value: "{\n \"code\": \"internal_error\",\n \"message\": \"An unexpected error occurred\",\n \"solution\": \"Please try again later or contact support\"\n }"
'429':
description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiRateLimitResponse'
examples:
Rate limit exceeded example:
summary: API rate limit exceeded
value: "{\n \"error\": \"API rate limit exceeded\",\n \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n \"requestLimit\": 100,\n \"requestCount\": 100,\n \"limits\": [\n {\n \"requestLimit\": 100,\n \"timeInSeconds\": 10\n },\n {\n \"requestLimit\": 500,\n \"timeInSeconds\": 60\n }\n ],\n \"currentTime\": \"2026-01-15T10:30:00\",\n \"nextResetAt\": \"2026-01-15T10:30:10\"\n }"
/public/v1/alpha/exposure/{id}/graph:
get:
tags:
- Exposure
summary: Get exposure graph by exposure analysis id
description: '**Performance impact**: Medium'
operationId: getExposureGraphById
parameters:
- name: id
in: path
required: true
schema:
type: integer
format: int32
- name: filter
in: query
required: false
schema:
$ref: '#/components/schemas/ExposureFilter'
responses:
'200':
description: OK
content:
'*/*':
schema:
$ref: '#/components/schemas/ExposureGraph'
'403':
description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
content:
application/json:
schema:
$ref: '#/components/schemas/AccessDeniedErrorDTO'
examples:
Access denied example:
summary: User lacks necessary permissions or authentication
value: "{\n \"loggedIn\": true,\n \"code\": \"access_denied\",\n \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n \"solution\": \"Contact support for appropriate permissions\"\n }"
'500':
description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDTO'
examples:
Error - Server Error:
summary: Unexpected server error
value: "{\n \"code\": \"internal_error\",\n \"message\": \"An unexpected error occurred\",\n \"solution\": \"Please try again later or contact support\"\n }"
'429':
description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiRateLimitResponse'
examples:
Rate limit exceeded example:
summary: API rate limit exceeded
value: "{\n \"error\": \"API rate limit exceeded\",\n \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n \"requestLimit\": 100,\n \"requestCount\": 100,\n \"limits\": [\n {\n \"requestLimit\": 100,\n \"timeInSeconds\": 10\n },\n {\n \"requestLimit\": 500,\n \"timeInSeconds\": 60\n }\n ],\n \"currentTime\": \"2026-01-15T10:30:00\",\n \"nextResetAt\": \"2026-01-15T10:30:10\"\n }"
components:
schemas:
Data:
required:
- type
type: object
properties:
type:
type: string
example: null
discriminator:
propertyName: type
example: null
Connection:
required:
- createdAt
- customer1Id
- customer2Id
- initiatorCustomerId
- pending
- state
- targetCustomerId
type: object
properties:
customer1Id:
type: integer
format: int32
example: null
customer2Id:
type: integer
format: int32
example: null
initiatorCustomerId:
type: integer
format: int32
example: null
state:
type: string
enum:
- Confirmed
- Rejected
- Failed
example: null
pending:
type: boolean
example: null
initiatorId:
type:
- integer
- 'null'
format: int32
example: null
comment:
type:
- string
- 'null'
example: null
email:
type:
- string
- 'null'
example: null
text:
type:
- string
- 'null'
example: null
createdAt:
type: string
format: date-time
example: null
targetCustomerId:
type: integer
format: int32
example: null
example: null
RiskAnalysisType:
required:
- availablePerspectives
- hideDetails
- products
- recommended
- scoping
- tierNAnalysisEnabled
- type
type: object
properties:
type:
type: string
enum:
- Default
- LkSG
- Norwegian Transparancy Act
- CSDDD (Beta)
- EU Battery Regulation
example: null
hideDetails:
type: boolean
example: null
recommended:
type: boolean
example: null
tierNAnalysisEnabled:
type: boolean
example: null
scoping:
type: boolean
example: null
products:
type: boolean
example: null
component:
type:
- string
- 'null'
enum:
- PeerScore
- AlertScore
- SSAScore
- ExternalScore
- TierNScore
example: null
perspectiveId:
type:
- integer
- 'null'
format: int32
example: null
availablePerspectives:
type: array
items:
$ref: '#/components/schemas/PerspectiveDTO'
example: null
countryScoreThreshold:
type:
- number
- 'null'
format: double
example: null
industryScoreThreshold:
type:
- number
- 'null'
format: double
example: null
purchaseVolumeThreshold:
type:
- number
- 'null'
format: double
example: null
example: null
ExposureFilter:
required:
- overviewTiers
- riskTargetIds
- targetIds
type: object
properties:
overviewTiers:
type: integer
format: int32
example: null
query:
type:
- string
- 'null'
example: null
exposedQuery:
type:
- string
- 'null'
example: null
riskTargetIds:
type: array
items:
type: integer
format: int32
example: null
example: null
targetIds:
type: array
items:
type: integer
format: int32
example: null
example: null
example: null
CollectionDTO:
required:
- children
- collectionTreeFilter
- commodityFilter
- deliverySettingTypes
- id
- isMonitored
- isParentMonitored
- lanes
- level
- name
- own
- path
- scope
- tiersEnabled
- type
- uuid
type: object
properties:
id:
type: integer
format: int32
example: null
uuid:
type: string
format: uuid
example: null
scope:
type: string
enum:
- User
- Customer
- Featured
example: null
type:
type: string
enum:
- Default
- Commodity
- Ariba
example: null
collection:
type:
- string
- 'null'
example: null
name:
type: string
example: null
user:
$ref: '#/components/schemas/UserDTO'
deliverySettingTypes:
type: array
items:
$ref: '#/components/schemas/DeliverySettingTypeDTO'
example: null
logo:
type:
- string
- 'null'
example: null
count:
type:
- integer
- 'null'
format: int32
example: null
isMonitored:
type: boolean
example: null
isParentMonitored:
type: boolean
example: null
own:
type: boolean
example: null
lanes:
type: boolean
example: null
tiersEnabled:
type: boolean
example: null
tierSettings:
allOf:
- $ref: '#/components/schemas/TierSettingsDTO'
example: null
collectionTreeFilter:
type: array
items:
type: integer
format: int32
example: null
example: null
userId:
type:
- integer
- 'null'
format: int32
example: null
customerId:
type:
- integer
- 'null'
format: int32
example: null
organizationId:
type:
- integer
- 'null'
format: int32
example: null
viewedWithRole:
type:
- string
- 'null'
enum:
- Manager
- Editor
example: null
parentId:
type:
- integer
- 'null'
format: int32
example: null
children:
type: array
items:
$ref: '#/components/schemas/CollectionDTO'
example: null
level:
type: integer
format: int32
example: null
path:
type: array
items:
$ref: '#/components/schemas/CollectionRef'
example: null
commodityFilter:
type: array
items:
$ref: '#/components/schemas/CommodityFilterId'
example: null
updatedAt:
type:
- string
- 'null'
format: date-time
example: null
monitored:
type: boolean
writeOnly: true
example: null
parentMonitored:
type: boolean
writeOnly: true
example: null
example: null
CommodityFilter:
required:
- commodities
- logisticsProvider
- suspectedSuppliers
type: object
properties:
commodities:
type: array
items:
$ref: '#/components/schemas/CommodityFilterId'
example: null
suspectedSuppliers:
type: boolean
example: null
logisticsProvider:
type: boolean
example: null
example: null
TierSettingsDTO:
required:
- logisticsProvider
- maxTier
- scopePrivate
- scopePublic
- scopeShared
- sourceCustomer
- sourceCustoms
- sourceMedia
- sourcePrewavePrediction
- suspectedSuppliers
- tier2MinPrio
- tier2TargetPrio
- tier3PlusMinPrio
- tier3PlusTargetPrio
type: object
properties:
maxTier:
type: integer
format: int32
example: null
tier2TargetPrio:
type: string
enum:
- Low
- Mid
- High
- Critical
example: null
tier3PlusTargetPrio:
type: string
enum:
- Low
- Mid
- High
- Critical
example: null
tier2MinPrio:
type: string
enum:
- Low
- Mid
- High
- Critical
example: null
tier3PlusMinPrio:
type: string
enum:
- Low
- Mid
- High
- Critical
example: null
scopePrivate:
type: boolean
example: null
scopeShared:
type: boolean
example: null
scopePublic:
type: boolean
example: null
sourceCustoms:
type: boolean
example: null
sourcePrewavePrediction:
type: boolean
example: null
sourceMedia:
type: boolean
example: null
sourceCustomer:
type: boolean
example: null
minShipments:
type:
- integer
- 'null'
format: int32
example: null
probability:
type:
- integer
- 'null'
format: int32
example: null
lastShipmentsPeriodFrom:
type:
- string
- 'null'
format: date
example: null
lastShipmentsPeriodTo:
type:
- string
- 'null'
format: date
example: null
suspectedSuppliers:
type: boolean
example: null
logisticsProvider:
type: boolean
example: null
example: null
RiskAnalysisLock:
required:
- locked
- type
type: object
properties:
type:
type: string
enum:
- Form
- Suppliers
- Matrix
- Actions
- Scoping
- Products
example: null
locked:
type: boolean
example: null
user:
$ref: '#/components/schemas/UserDTO'
lockedAt:
type:
- string
- 'null'
format: date-time
example: null
example: null
EdgeImpactData:
required:
- causalContribution
- coc
- daysOnHand
- deviation
- edgeId
- stockAtSupplier
- stockOnPremise
- validFrom
- validTo
type: object
properties:
edgeId:
type: integer
format: int32
example: null
validFrom:
type: string
format: date-time
example: null
validTo:
type: string
format: date-time
example: null
purchase:
type:
- number
- 'null'
example: null
actualPurchase:
type:
- number
- 'null'
example: null
diForced:
type:
- string
- 'null'
enum:
- NA
- 'No'
- Low
- Mid
- High
- Critical
example: null
di:
type:
- number
- 'null'
format: double
example: null
causalContribution:
type: boolean
example: null
bi12:
type:
- number
- 'null'
example: null
coc:
type: boolean
example: null
mttrGrossE:
type:
- number
- 'null'
format: double
example: null
mttrNetE:
type:
- number
- 'null'
format: double
example: null
mttrGrossI:
type:
- number
- 'null'
format: double
example: null
mttrNetI:
type:
- number
- 'null'
format: double
example: null
stockOnPremise:
type: number
format: double
example: null
stockAtSupplier:
type: number
format: double
example: null
daysOnHand:
type: number
format: double
example: null
deviation:
type: string
enum:
- NotApplicable
- OnTarget
- Below
- Above
example: null
location:
type:
- string
- 'null'
enum:
- SameBuilding
- DifferentFireSection
- DifferentBuilding
- NotApplicable
example: null
lastConfirmationDate:
type:
- string
- 'null'
format: date
example: null
birsInfo:
type:
- string
- 'null'
example: null
biForced:
type:
- string
- 'null'
enum:
- NA
- 'No'
- Low
- Mid
- High
- Critical
example: null
bi:
type:
- number
- 'null'
for
# --- truncated at 32 KB (89 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/prewave/refs/heads/main/openapi/prewave-exposure-api-openapi.yml