Summary:
-
To read all entries use GET
-
To read one specific entry use GET(id)
-
To create a new entry use POST + body with (all) properties
-
To update an existing entry use PATCH(id) + eTag + body with properties to update
-
To delete an existing entry use DELETE(id)
Overview
Contents
The contents of the APIs are selected as the most important fields in Wisefish. They should fulfill the needs for most users, but anyway in most tables there are more fields that do not have a property in the API.
Record ID
When interacting with specific records (e.g., a particular customer, item, or sales order), the record's unique ID is included in the URL to identify it.
For example, to retrieve a specific purchase agreement, the URL would include the agreement's ID:
<https://{businesscentralPrefix}/api/wisefish/base/v1.0/companies({companyId})/purchaseAgreements({agreementId})>
Where {agreementId} is the GUID of the agreement entry.
Similarly, for operations like deleting or updating a record, the record's ID is essential in the URL to target the correct entry.
In some cases, for better usability, the primary key of the entry could be used as a record ID, but not the GUID. The documentation mentions which field is used as a record ID.
Validating Data
When updating data, the API properties act in a very similar way as the fields on the pages within BC/Wisefish. The error handling that takes place when a user validates a field in Wisefish, is exactly the same as when the same field is populated with the API. The field order of the API will control the order of which fields are validated into the table. Changing the order of the payload (body object) will not have affect on how the fields are validated into the record.
Procedure Endpoints
There are also some specific procedure endpoints that modify data. They can have additional error handling and therefore return a runtime error (400) so that no entry is created in the database. Therefore these methods can safely be used when there is a human being watching the response.
Using these API procedures is not recommended for integration with production systems. In that case, it is usually better to use the inbound integration queue.
See: External Production API - User Documentation
Reading data (GET)
Request all entries
Data is retrieved with a GET request where the URL is is combined as follows:
GET
[server]/api/wisefish/base/v1.0/companies([CompanyGUID])/[endpoint]
Response
The data should be read from the value property of the returned object. It will be an array of JSON objects, where each object has all the properties in this particular API page.
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items",
"value": [the array of objects]
}
Example:
To get all the items exposed by the API from the environment BC24BjarteyW1CU1rest on the containers.wisefish.com:
https://containers.wisefish.com/BC24BjarteyW1CU1rest/api/wisefish/base/v1.0/companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items
The data is returned as JSON.
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items",
"value": [
{
"@odata.etag": "W/\"JzIwOzEwNTMxOTAxNzk1NTEwMjk4MDc4MTswMDsn\"",
"id": "00684ed0-9ea1-ef11-b017-aa2d6f3d6955",
"no": "0900",
"description": "Þorskflök",
"packageDescriptionType": "Trade Item",
"packageDescription": "1 x 10",
"tradeItemType": "Product",
"itemCategoryCode": "FISH-PROD",
"rawMaterialReportingCode": "001",
"inventoryPostingGroup": "FINISHED",
"blocked": false,
"status": " ",
"baseUnitOfMeasure": "KG",
"tradeItemUnitOfMeasure": "BOX",
"palletUnitOfMeasure": "PALLET",
"weightUnitOfMeasure": "KG",
"unitPrice": 7.5,
"priceIncludesTax": false,
"unitCost": 5,
"lastModifiedDateTime": "2025-11-12T17:32:20.743Z"
},
{
"@odata.etag": "W/\"JzIwOzE0MTEzNjQxMTU1MTg5MDQ5MTAzMTswMDsn\"",
"id": "234fffc2-dd11-ef11-9f8b-6045bde9cc61",
"no": "1000",
"description": "Bicycle",
"packageDescriptionType": " ",
"packageDescription": "",
"tradeItemType": " ",
"itemCategoryCode": "",
"rawMaterialReportingCode": "",
"inventoryPostingGroup": "FINISHED",
"blocked": false,
"status": " ",
"baseUnitOfMeasure": "PCS",
"tradeItemUnitOfMeasure": "",
"palletUnitOfMeasure": "",
"weightUnitOfMeasure": "",
"unitPrice": 4000,
"priceIncludesTax": false,
"unitCost": 350.594,
"lastModifiedDateTime": "2025-07-21T11:19:01.34Z"
}
]
}
Request a single entry
To request a specific entry, the user must know the record ID of that particular entry. The documentation for each endpoint should say which field is used as a record id.
In this case, it can be read from the property id when entries are retrieved with GET.
GET
[server]/api/wisefish/wiFiEP/v1.0/companies([CompanyGUID])/[endpoint]([recordID])
Response
The response will be a JSON object, with all the properties of this particular API object, looking like this
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies([companyId])/[endpoint]/$entity",
"@odata.etag": [etag],
"id" : the requested id,
property 1,
property 2,
etc....
}
Example:
To get the item with system ID = 00684ed0-9ea1-ef11-b017-aa2d6f3d6955:
https://containers.wisefish.com/BC24BjarteyW1CU1rest/api/wisefish/base/v1.0/companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items(00684ed0-9ea1-ef11-b017-aa2d6f3d6955)
Response:
{
"@odata.context": "https://containers.wisefish.com/BC/api/wisefish/base/v1.0/$metadata#companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items/$entity",
"@odata.etag": "W/\"JzIwOzEwNTMxOTAxNzk1NTEwMjk4MDc4MTswMDsn\"",
"id": "00684ed0-9ea1-ef11-b017-aa2d6f3d6955",
"no": "0900",
"description": "Þorskflök",
"packageDescriptionType": "Trade Item",
"packageDescription": "1 x 10",
"tradeItemType": "Product",
"itemCategoryCode": "FISH-PROD",
"rawMaterialReportingCode": "001",
"inventoryPostingGroup": "FINISHED",
"blocked": false,
"status": " ",
"baseUnitOfMeasure": "KG",
"tradeItemUnitOfMeasure": "BOX",
"palletUnitOfMeasure": "PALLET",
"weightUnitOfMeasure": "KG",
"unitPrice": 7.5,
"priceIncludesTax": false,
"unitCost": 5,
"lastModifiedDateTime": "2025-11-12T17:32:20.743Z"
}
Show child entries
For some APIs there are child entries. To make them visible in the response, the expand URL parameter must be used:
GET
[server]/api/wisefish/wiFiEP/v1.0/companies([CompanyGUID])/[endpoint]([recordID])?$expand=[detailsAPI]
See example:
Filtering
A filter is added with $filter. An example of how a filter is added:
https://containers.wisefish.com/BC24BjarteyW1CU1rest/api/wisefish/base/v1.0/companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/itemUnitOfMeasures?$filter=itemNo eq '70070'
Modifying data
Create an entry (POST)
Data is created with a POST request where the body contains the properties for all entry fields to be populated:
POST
[server]/api/wisefish/wiFiEP/v1.0/companies([CompanyGUID])/[endpoint]
Body:
{[The input is a JSON object of the format the API expects. The names of the properties must match exactly the API.]}
Response
The response of a create request is a JSON object will all the properties of the object that was created. Same as when getting one entry.
Update an entry (PATCH)
Modifying entries with API requires the use of eTags. This is done to make sure user has the latest update of the data.
The updating process must be like this:
-
Use GET to find out the current etag for the entry to updated: This is kept in property
@odata.etagwhich is the second one on the response object. -
Use a PATCH request and
-
set the value of
@odata.etagon the key If-Match on the header -
set the properties to be updated in the body
-
GET the id and etag
{
"@odata.etag": "W/\"JzExOzE7MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA=\"", // Example of an etag
"id": "0c9e...", // Example of an id
"property1": "",
"property2": "",
...
}
PATCH
[server]/api/wisefish/wiFiEP/v1.0/companies([CompanyGUID])/[endpoint]([recordID])
If-Match: W/"JzExOzE7MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA="
Body:
{
properties to update
}
Response
The response of a patch request is a JSON object will all the properties of the object, not only the updated ones.
If PATCH fails, it is because one of the below:
✔ missing ETag
✔ invalid ETag
✔ trying to update a non-editable field
Note: POST can sometimes be used to update an existing entry, if the primary key is given, but this is not correct usage and not recommended because empty properties in the body will erase the current values of the entry.
Delete an entry (DELETE)
To delete an entry, use the record ID of the and do a DELETE request:
DELETE
[server]/api/wisefish/wiFiEP/v1.0/companies([CompanyGUID])/[endpoint]([recordID])
Response
This request does not have a response object or text. If it runs without error, the delete was a success.
Example:
To delete the item with record ID = 00684ed0-9ea1-ef11-b017-aa2d6f3d6955:
DELETE
https://containers.wisefish.com/BC24BjarteyW1CU1rest/api/wisefish/base/v1.0/companies(cf9f7b85-dd11-ef11-9f8b-6045bde9cc61)/items(00684ed0-9ea1-ef11-b017-aa2d6f3d6955)
Using procedures
For some endpoints, procedures have been added that are “service enabled”. This means that an additional endpoint will exist on the following URL format:
[server]/api/wisefish/base/v1.0/companies([CompanyGUID])/[endpoint]([recordID])/Microsoft.NAV.[procedureName]
-
These endpoints are only used with POST requests.
-
If the procedure has defined parameters, all of them must exist in the body.
-
They can be blank, if the procedure allows blank values.
Request is like this:
POST
https:/[server]/api/wisefish/base/v1.0/companies([CompanyGUID])/[endpoint]([recordID])/Microsoft.NAV.[procedureName]
Body:
{
...the parameters in the body, if the procedure has parameters
}