curl --request GET \
--url https://api.watchdog.no/v1/agreements \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.watchdog.no/v1/agreements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.watchdog.no/v1/agreements"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"status": "draft",
"effective_date": "<string>",
"expiration_date": "<string>",
"suppliers": [],
"recipients": [],
"tags": [],
"projects": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"project_numbers": [
"<string>"
]
}
],
"owner_user_id": "<string>",
"owner": {
"user_id": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>"
},
"readiness": {
"ready": true,
"reasons": [
"inactive"
]
},
"renewal_action": {
"kind": "cancel_by",
"deadline": "<string>"
},
"version": 1,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"alert_summary": {
"counts": {
"pending": {
"credited": 1,
"uncredited": 1
},
"accepted": {
"credited": 1,
"uncredited": 1
},
"dismissed": {
"credited": 1,
"uncredited": 1
}
},
"pending_topic_count": 1,
"organization_currency": {
"currency_code": "<string>",
"impact_amount": "<string>",
"by_verdict": {
"pending": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
},
"accepted": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
},
"dismissed": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
}
}
}
},
"relationships": {
"price_item_count": 1,
"document_count": 1,
"invoice_match_count": 1,
"supplier_invoice_count": 1
}
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "validation_error",
"message": "The request is invalid. details lists up to 20 field errors. Request bodies are limited to 2 MiB.",
"request_id": "req_example"
}
}{
"error": {
"code": "invalid_token",
"message": "The bearer token is missing or invalid.",
"request_id": "req_example"
}
}{
"error": {
"code": "forbidden",
"message": "Access denied. The error code says why: forbidden, token_disabled, organization_required, insufficient_role or mfa_required.",
"request_id": "req_example"
}
}{
"error": {
"code": "not_found",
"message": "The resource does not exist in the current organization.",
"request_id": "req_example"
}
}{
"error": {
"code": "conflict",
"message": "One or more selected teams have invalid saved filter rules. Update the team filters before retrying.",
"request_id": "req_example"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Wait for the Retry-After delay before retrying.",
"request_id": "req_example"
}
}{
"error": {
"code": "internal_error",
"message": "Unexpected server failure. Include the request ID when contacting support.",
"request_id": "req_example"
}
}{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable. Retry after the Retry-After delay, when provided.",
"request_id": "req_example"
}
}List agreements
Lists agreement summaries with the requested filters. For upcoming dates, upcoming_through finds agreements whose renewal deadline (renewal_action.deadline: cancel or renew by then) or expiration date falls between today and the given date. Use next_cursor with the same filters and sorting to read more. Read an individual agreement, its documents and its prices for the full details.
curl --request GET \
--url https://api.watchdog.no/v1/agreements \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.watchdog.no/v1/agreements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.watchdog.no/v1/agreements"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"status": "draft",
"effective_date": "<string>",
"expiration_date": "<string>",
"suppliers": [],
"recipients": [],
"tags": [],
"projects": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"project_numbers": [
"<string>"
]
}
],
"owner_user_id": "<string>",
"owner": {
"user_id": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"email": "<string>"
},
"readiness": {
"ready": true,
"reasons": [
"inactive"
]
},
"renewal_action": {
"kind": "cancel_by",
"deadline": "<string>"
},
"version": 1,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"alert_summary": {
"counts": {
"pending": {
"credited": 1,
"uncredited": 1
},
"accepted": {
"credited": 1,
"uncredited": 1
},
"dismissed": {
"credited": 1,
"uncredited": 1
}
},
"pending_topic_count": 1,
"organization_currency": {
"currency_code": "<string>",
"impact_amount": "<string>",
"by_verdict": {
"pending": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
},
"accepted": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
},
"dismissed": {
"credited": {
"alert_count": 123,
"impact_amount": "<string>"
},
"uncredited": {
"alert_count": 123,
"impact_amount": "<string>"
}
}
}
}
},
"relationships": {
"price_item_count": 1,
"document_count": 1,
"invoice_match_count": 1,
"supplier_invoice_count": 1
}
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "validation_error",
"message": "The request is invalid. details lists up to 20 field errors. Request bodies are limited to 2 MiB.",
"request_id": "req_example"
}
}{
"error": {
"code": "invalid_token",
"message": "The bearer token is missing or invalid.",
"request_id": "req_example"
}
}{
"error": {
"code": "forbidden",
"message": "Access denied. The error code says why: forbidden, token_disabled, organization_required, insufficient_role or mfa_required.",
"request_id": "req_example"
}
}{
"error": {
"code": "not_found",
"message": "The resource does not exist in the current organization.",
"request_id": "req_example"
}
}{
"error": {
"code": "conflict",
"message": "One or more selected teams have invalid saved filter rules. Update the team filters before retrying.",
"request_id": "req_example"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Wait for the Retry-After delay before retrying.",
"request_id": "req_example"
}
}{
"error": {
"code": "internal_error",
"message": "Unexpected server failure. Include the request ID when contacting support.",
"request_id": "req_example"
}
}{
"error": {
"code": "service_unavailable",
"message": "Temporarily unavailable. Retry after the Retry-After delay, when provided.",
"request_id": "req_example"
}
}Authorizations
Personal API key sent as a bearer token, together with X-Organization-Id. The key must have at least the access level the endpoint requires (read, write or admin).
Headers
The organization to act in. Required for personal API keys; list the organizations you can access with GET /v1/organizations.
Query Parameters
Return only these fields of each row, comma-separated; use dots for nested fields, such as suppliers.id. id is always returned. Fields: id, title, status, effective_date, expiration_date, suppliers, recipients, tags, projects, owner_user_id, owner, readiness, renewal_action, version, created_at, updated_at, alert_summary, relationships.
Only records matched by the filters of teams you belong to. Teams combine with OR; other filters combine with AND. Cannot be combined with team_ids.
true, false Only records matched by the filters of these teams: at most 50, comma-separated in a query string or an array in a JSON body. Teams combine with OR. Unknown teams return 404.
Only these agreement IDs (maximum 50).
Agreements whose next renewal action is any of these kinds: cancel_by (renews automatically unless cancelled by the deadline), renew_by (ends unless renewed by the deadline), automatic_notice (renews automatically with no expiration date; it can be ended at any time with the notice period, so there is no deadline), missing_details (renewal terms exist but the deadline cannot be computed), none (does not renew, or no renewals remain).
Renewal action deadline on or after this date.
^\d{4}-\d{2}-\d{2}$Renewal action deadline on or before this date.
^\d{4}-\d{2}-\d{2}$Agreements with a renewal deadline or an expiration date from today, in the organization's timezone, through this date: what must be cancelled, renewed or will end soon.
^\d{4}-\d{2}-\d{2}$Text in the agreement title or a supplier name.
1 - 200Agreements with any of these statuses: draft (being set up), active (Watchdog checks invoices against it) or archived (no longer checked). It does not say whether the contract term is in force: use expiration_date, renewal_action or the valid_on filter for that.
Agreements covering any of these suppliers.
Agreements covering any of these recipients, including agreements for any recipient.
Agreements with any of these tags.
Any selected project. Always combined with other dimensions using AND. Unavailable IDs return 404.
Any selected owner. IDs are case-sensitive. Unavailable members return 404.
is, is_not is, is_not Combine supplier and tag ID filters with AND (default) or OR. Other filters and the organization boundary always apply.
and, or Agreements with at least one alert with any of these verdicts. Combine with has_alert_credited to match both on the same alert. Comma-separated: pending, accepted, dismissed.
Agreements with at least one alert that is (true) or is not (false) credited.
true, false Effective (start) date on or after this date; excludes agreements without one.
^\d{4}-\d{2}-\d{2}$Effective (start) date on or before this date; excludes agreements without one.
^\d{4}-\d{2}-\d{2}$Expiration date on or after this date; excludes agreements without one.
^\d{4}-\d{2}-\d{2}$Expiration date on or before this date; excludes agreements without one.
^\d{4}-\d{2}-\d{2}$Agreements in force on this date: effective on or before it and expiring on or after it. A missing effective or expiration date counts as open-ended.
^\d{4}-\d{2}-\d{2}$Maximum number of results per page.
1 <= x <= 1000Opaque next_cursor from the previous page. Keep the same filters and sort; omit for the first page.
4096alert_progress is the share of alerts that are no longer pending. open_alert_impact is the pending and claimed impact in the organization currency.
created_at, status, renewal_deadline, title, effective_date, expiration_date, supplier, pending_topic_count, alert_progress, open_alert_impact asc, desc