Item vendors
Which vendors supply an item, and at what cost.
This resource needs the inventory feature active on the install you are calling. Without that every endpoint here answers 403 with feature_not_licensed - that is a licensing answer, not a permissions one, so check the company's features before the token's scopes.
The object#
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| itemid | integer | Reference to items, by id. Write either this or item. |
| item | string(255) | The sku of the referenced items, instead of the id. Send this or itemid, not both unless they agree. |
| vordernumber | string(30) | The vendor’s own catalog/order number for the item, printed on POs. |
| vitemunitnameid | integer | Reference to unitnames, by id. Write either this or vitemunitname. |
| vitemunitname | string(50) | The unitname of the referenced unitnames, instead of the id. Send this or vitemunitnameid, not both unless they agree. |
| vitemconversionmoney | string(6dp) | Stored as decimal(12,6). |
| vitemcost1money | string(5dp) | Stored as decimal(19,5). |
| vitemqty1money | string(6dp) | Stored as decimal(18,6). |
| vitemcost2money | string(5dp) | Stored as decimal(19,5). |
| vitemqty2money | string(6dp) | Stored as decimal(18,6). |
| vitemcost3money | string(5dp) | Stored as decimal(19,5). |
| vitemqty3money | string(6dp) | Stored as decimal(18,6). |
| vitemcost4money | string(5dp) | Stored as decimal(19,5). |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| mfg | string(50) | Manufacturer name for this vendor’s version of the item. |
| is_default | boolean | 1 when this is the item’s default vendor. |
| freightpercentnumber | string(2dp) | Numeric string, 2 decimal places. Not money - do not apply currency rounding. |
| leadtimedays | integer | Lead time in days for this vendor to supply the item. |
| notes | text | Notes. Stored as text, no practical length limit. |
| upc | string(255) | Universal Product Code. |
| bestbuymoney | string(6dp) | Stored as decimal(18,6). |
| externalid | string(100) | Your own key. Scoped to your company. |
Endpoints#
Create many.
Requires scope items:write.
| Name | In | Type | Notes |
|---|---|---|---|
| Idempotency-Key | header | string | Makes the write safely retryable. Any unique string per logical operation; a UUID is fine.
The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing.
The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours. |
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| itemid | integer | Reference to items, by id. Write either this or item. |
| item | string(255) | The sku of the referenced items, instead of the id. Send this or itemid, not both unless they agree. |
| vordernumber | string(30) | The vendor’s own catalog/order number for the item, printed on POs. |
| vitemunitnameid | integer | Reference to unitnames, by id. Write either this or vitemunitname. |
| vitemunitname | string(50) | The unitname of the referenced unitnames, instead of the id. Send this or vitemunitnameid, not both unless they agree. |
| vitemconversionmoney | string(6dp) | Stored as decimal(12,6). |
| vitemcost1money | string(5dp) | Stored as decimal(19,5). |
| vitemqty1money | string(6dp) | Stored as decimal(18,6). |
| vitemcost2money | string(5dp) | Stored as decimal(19,5). |
| vitemqty2money | string(6dp) | Stored as decimal(18,6). |
| vitemcost3money | string(5dp) | Stored as decimal(19,5). |
| vitemqty3money | string(6dp) | Stored as decimal(18,6). |
| vitemcost4money | string(5dp) | Stored as decimal(19,5). |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| mfg | string(50) | Manufacturer name for this vendor’s version of the item. |
| is_default | boolean | 1 when this is the item’s default vendor. |
| freightpercentnumber | string(2dp) | Numeric string, 2 decimal places. Not money - do not apply currency rounding. |
| leadtimedays | integer | Lead time in days for this vendor to supply the item. |
| notes | text | Notes. Stored as text, no practical length limit. |
| upc | string(255) | Universal Product Code. |
| bestbuymoney | string(6dp) | Stored as decimal(18,6). |
| externalid | string(100) | Your own key. Scoped to your company. |
curl -X POST \ 'https://acme.nolapro.com/!/api/v2/itemvendors/batch' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '[ { "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104 } ]'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/batch'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ [ 'vendorid' => 104, 'vendor' => 'Example vendor', 'itemid' => 104, 'item' => 'Example item', 'vordernumber' => 'INV-88421', 'vitemunitnameid' => 104, ], ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.post( "https://acme.nolapro.com/!/api/v2/itemvendors/batch", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json=[ { "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104, }, ], ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors/batch', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify([ { vendorid: 104, vendor: "Example vendor", itemid: 104, item: "Example item", vordernumber: "INV-88421", vitemunitnameid: 104, }, ]), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new[] { new { vendorid = 104, vendor = "Example vendor", itemid = 104, item = "Example item", vordernumber = "INV-88421", vitemunitnameid = 104, }, }; var req = new HttpRequestMessage(HttpMethod.Post, "https://acme.nolapro.com/!/api/v2/itemvendors/batch") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
List item vendors.
Requires scope items:read.
| Name | In | Type | Notes |
|---|---|---|---|
| vendorid | query | string | Restrict to one vendorid. |
| itemid | query | string | Restrict to one itemid. |
| cancel | query | string | Defaults to false. Pass true or any. |
| modifiedsince | query | string | RFC 3339 UTC timestamp. Returns only records changed since then, including cancelled ones - so cancel defaults to any rather than false when this is used. The response carries _meta.synced_through; store it and send it back next time. |
| externalid | query | string | Exact match on your own key. |
| include | query | string | Comma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions. |
| Status | Code | Meaning |
|---|---|---|
| 403 | insufficient_scope | Token lacks read scope. |
curl \ 'https://acme.nolapro.com/!/api/v2/itemvendors' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.get( "https://acme.nolapro.com/!/api/v2/itemvendors", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors', { method: 'GET', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var res = await http.GetAsync( "https://acme.nolapro.com/!/api/v2/itemvendors"); res.EnsureSuccessStatusCode();
Create.
Requires scope items:write.
| Name | In | Type | Notes |
|---|---|---|---|
| Idempotency-Key | header | string | Makes the write safely retryable. Any unique string per logical operation; a UUID is fine.
The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing.
The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours. |
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| itemid | integer | Reference to items, by id. Write either this or item. |
| item | string(255) | The sku of the referenced items, instead of the id. Send this or itemid, not both unless they agree. |
| vordernumber | string(30) | The vendor’s own catalog/order number for the item, printed on POs. |
| vitemunitnameid | integer | Reference to unitnames, by id. Write either this or vitemunitname. |
| vitemunitname | string(50) | The unitname of the referenced unitnames, instead of the id. Send this or vitemunitnameid, not both unless they agree. |
| vitemconversionmoney | string(6dp) | Stored as decimal(12,6). |
| vitemcost1money | string(5dp) | Stored as decimal(19,5). |
| vitemqty1money | string(6dp) | Stored as decimal(18,6). |
| vitemcost2money | string(5dp) | Stored as decimal(19,5). |
| vitemqty2money | string(6dp) | Stored as decimal(18,6). |
| vitemcost3money | string(5dp) | Stored as decimal(19,5). |
| vitemqty3money | string(6dp) | Stored as decimal(18,6). |
| vitemcost4money | string(5dp) | Stored as decimal(19,5). |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| mfg | string(50) | Manufacturer name for this vendor’s version of the item. |
| is_default | boolean | 1 when this is the item’s default vendor. |
| freightpercentnumber | string(2dp) | Numeric string, 2 decimal places. Not money - do not apply currency rounding. |
| leadtimedays | integer | Lead time in days for this vendor to supply the item. |
| notes | text | Notes. Stored as text, no practical length limit. |
| upc | string(255) | Universal Product Code. |
| bestbuymoney | string(6dp) | Stored as decimal(18,6). |
| externalid | string(100) | Your own key. Scoped to your company. |
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A required field was missing. |
curl -X POST \ 'https://acme.nolapro.com/!/api/v2/itemvendors' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '{ "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104 }'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => json_encode([ 'vendorid' => 104, 'vendor' => 'Example vendor', 'itemid' => 104, 'item' => 'Example item', 'vordernumber' => 'INV-88421', 'vitemunitnameid' => 104, ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.post( "https://acme.nolapro.com/!/api/v2/itemvendors", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json={ "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104, }, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify({ vendorid: 104, vendor: "Example vendor", itemid: 104, item: "Example item", vordernumber: "INV-88421", vitemunitnameid: 104, }), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new { vendorid = 104, vendor = "Example vendor", itemid = 104, item = "Example item", vordernumber = "INV-88421", vitemunitnameid = 104, }; var req = new HttpRequestMessage(HttpMethod.Post, "https://acme.nolapro.com/!/api/v2/itemvendors") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"vendorid": 104,
"vendor": "Example vendor",
"itemid": 104,
"item": "Example item",
"vordernumber": "INV-88421",
"vitemunitnameid": 104
}
Retrieve one record.
Requires scope items:read.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| include | query | string | Comma-separated extras to embed. Only custom_fields is available: the extra fields this install has defined on the record. Off by default, and an unrecognised value is refused rather than ignored. See Conventions. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl \ 'https://acme.nolapro.com/!/api/v2/itemvendors/104' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.get( "https://acme.nolapro.com/!/api/v2/itemvendors/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors/104', { method: 'GET', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var res = await http.GetAsync( "https://acme.nolapro.com/!/api/v2/itemvendors/104"); res.EnsureSuccessStatusCode();
{
"vendorid": 104,
"vendor": "Example vendor",
"itemid": 104,
"item": "Example item",
"vordernumber": "INV-88421",
"vitemunitnameid": 104
}
Update.
Requires scope items:write.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| Idempotency-Key | header | string | Makes the write safely retryable. Any unique string per logical operation; a UUID is fine.
The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing.
The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours. |
| Field | Type | Description |
|---|---|---|
| idread-only | integer | NolaPro id. |
| vendorid | integer | Reference to vendors, by id. Write either this or vendor. |
| vendor | string(30) | Code for the referenced vendor, instead of the id. |
| itemid | integer | Reference to items, by id. Write either this or item. |
| item | string(255) | The sku of the referenced items, instead of the id. Send this or itemid, not both unless they agree. |
| vordernumber | string(30) | The vendor’s own catalog/order number for the item, printed on POs. |
| vitemunitnameid | integer | Reference to unitnames, by id. Write either this or vitemunitname. |
| vitemunitname | string(50) | The unitname of the referenced unitnames, instead of the id. Send this or vitemunitnameid, not both unless they agree. |
| vitemconversionmoney | string(6dp) | Stored as decimal(12,6). |
| vitemcost1money | string(5dp) | Stored as decimal(19,5). |
| vitemqty1money | string(6dp) | Stored as decimal(18,6). |
| vitemcost2money | string(5dp) | Stored as decimal(19,5). |
| vitemqty2money | string(6dp) | Stored as decimal(18,6). |
| vitemcost3money | string(5dp) | Stored as decimal(19,5). |
| vitemqty3money | string(6dp) | Stored as decimal(18,6). |
| vitemcost4money | string(5dp) | Stored as decimal(19,5). |
| cancel | boolean | Cancelled. NolaPro cancels rather than deletes, so a cancelled row is still readable. |
| entrydateread-only | string | When the record was created. |
| lastchangedateread-only | string | Last modification. Drives modifiedsince. |
| mfg | string(50) | Manufacturer name for this vendor’s version of the item. |
| is_default | boolean | 1 when this is the item’s default vendor. |
| freightpercentnumber | string(2dp) | Numeric string, 2 decimal places. Not money - do not apply currency rounding. |
| leadtimedays | integer | Lead time in days for this vendor to supply the item. |
| notes | text | Notes. Stored as text, no practical length limit. |
| upc | string(255) | Universal Product Code. |
| bestbuymoney | string(6dp) | Stored as decimal(18,6). |
| externalid | string(100) | Your own key. Scoped to your company. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl -X PATCH \ 'https://acme.nolapro.com/!/api/v2/itemvendors/104' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Content-Type: application/json' \ -H 'Idempotency-Key: your-unique-key' \ -d '{ "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104 }'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'PATCH', CURLOPT_POSTFIELDS => json_encode([ 'vendorid' => 104, 'vendor' => 'Example vendor', 'itemid' => 104, 'item' => 'Example item', 'vordernumber' => 'INV-88421', 'vitemunitnameid' => 104, ]), ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.patch( "https://acme.nolapro.com/!/api/v2/itemvendors/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, json={ "vendorid": 104, "vendor": "Example vendor", "itemid": 104, "item": "Example item", "vordernumber": "INV-88421", "vitemunitnameid": 104, }, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors/104', { method: 'PATCH', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, body: JSON.stringify({ vendorid: 104, vendor: "Example vendor", itemid: 104, item: "Example item", vordernumber: "INV-88421", vitemunitnameid: 104, }), } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var body = new { vendorid = 104, vendor = "Example vendor", itemid = 104, item = "Example item", vordernumber = "INV-88421", vitemunitnameid = 104, }; var req = new HttpRequestMessage(HttpMethod.Patch, "https://acme.nolapro.com/!/api/v2/itemvendors/104") { Content = JsonContent.Create(body), }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"vendorid": 104,
"vendor": "Example vendor",
"itemid": 104,
"item": "Example item",
"vordernumber": "INV-88421",
"vitemunitnameid": 104
}
Cancel.
Requires scope items:cancel.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The record id. |
| Idempotency-Key | header | string | Makes the write safely retryable. Any unique string per logical operation; a UUID is fine.
The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing.
The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No record with that id. |
curl -X DELETE \ 'https://acme.nolapro.com/!/api/v2/itemvendors/104' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/104'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'DELETE', ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.delete( "https://acme.nolapro.com/!/api/v2/itemvendors/104", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors/104', { method: 'DELETE', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var req = new HttpRequestMessage(HttpMethod.Delete, "https://acme.nolapro.com/!/api/v2/itemvendors/104"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();
{
"vendorid": 104,
"vendor": "Example vendor",
"itemid": 104,
"item": "Example item",
"vordernumber": "INV-88421",
"vitemunitnameid": 104
}
List files attached to an item vendor.
The attachments on this item vendor, newest first. Accepted filedefinitionid values: 12 (default 12). Metadata only - each file's bytes are at GET /attachments/{id}/content.
Requires scope items:read.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The item vendor id. |
| filedefinitionid | query | integer | Only files in this list. Accepted filedefinitionid values: 12 (default 12). |
| filecategoryid | query | integer | Only files filed under this category. |
| filename | query | string | Partial match on the file name, case insensitive. |
| Status | Code | Meaning |
|---|---|---|
| 404 | not_found | No item vendor with that id in this company. |
curl \ 'https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments' \ -H 'Authorization: Bearer $NP_TOKEN'
$ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true);
import os, requests r = requests.get( "https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}"}, ) r.raise_for_status()
const res = await fetch( 'https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments', { method: 'GET', headers: { Authorization: `Bearer ${process.env.NP_TOKEN}` }, } ); const data = await res.json();
using System.Net.Http.Json; var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); var res = await http.GetAsync( "https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments"); res.EnsureSuccessStatusCode();
Attach a file to an item vendor.
multipart/form-data with one file part; see the AttachmentUpload schema for the other parts. Accepted filedefinitionid values: 12 (default 12). Answers 201 with the attachment's metadata and Location: /attachments/{id}. Check _meta.warnings for datatype_truncated and stored_under_parent_company.
Requires scope items:write.
| Name | In | Type | Notes |
|---|---|---|---|
| idrequired | path | integer | The item vendor id. |
| Idempotency-Key | header | string | Makes the write safely retryable. Any unique string per logical operation; a UUID is fine.
The failure this prevents is specific: the request succeeds, the response is lost to a timeout, you retry, and the customer is billed twice. With a key, the retry returns the original response - same status, same body, same id - and creates nothing.
The body is part of the key's identity. Reusing a key with a different body is a bug on your side, not a retry, and answers 409 idempotency_replay rather than silently handing back the old response. Keys are remembered for 24 hours. |
| Field | Type | Description |
|---|---|---|
| filerequired | string | The file. Exactly one part named file; a second one, or file[], is 400 invalid_request so an idempotent retry can never half-succeed. Empty is refused. Over the cap (the smaller of APIV2_MAX_UPLOAD_BYTES, 64 MB by default, and PHP's upload_max_filesize / post_max_size) is 413 payload_too_large naming the limit that applied. |
| filename | string(255) | Overrides the part's file name. |
| notes | text | Free text shown beside the file. |
| filedefinitionid | integer | Only when the parent accepts more than one list. Anything the parent does not accept is 422 unknown_value naming the accepted ids. |
| filecategoryid | integer | Category by id. |
| filecategory | string(255) | Category by name. Sent with filecategoryid and disagreeing is 422 conflicting_reference. |
| Status | Code | Meaning |
|---|---|---|
| 400 | unknown_parameter | A form field that is not on the AttachmentUpload schema. |
| 400 | invalid_type | filedefinitionid or filecategoryid that is not an integer. |
| 404 | not_found | No item vendor with that id in this company. |
| 409 | upload_limit_reached | This file list allows a fixed number of files on an item vendor and it is full. Remove one first. |
| 413 | payload_too_large | The file is over the cap. The body names the limit that applied. |
| 415 | multipart_required | The body was not multipart/form-data. |
| 422 | unknown_value | filedefinitionid is not one this item vendor accepts, or the category does not exist in this company. |
curl -X POST \ 'https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments' \ -H 'Authorization: Bearer $NP_TOKEN' \ -H 'Idempotency-Key: your-unique-key' \ -F 'file=@grant-letter-signed.pdf' \ -F 'filename=grant-letter-signed.pdf' \ -F 'notes=Signed copy received 21 Sep' \ -F 'filedefinitionid=8' \ -F 'filecategory=Receipts'
$fields = [ 'filename' => 'grant-letter-signed.pdf', 'notes' => 'Signed copy received 21 Sep', 'filedefinitionid' => '8', 'filecategory' => 'Receipts', ]; $fields['file'] = new CURLFile('grant-letter-signed.pdf'); $ch = curl_init('https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('NP_TOKEN'), 'Idempotency-Key: your-unique-key'], CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $fields, ]); $res = json_decode(curl_exec($ch), true);
import os, requests with open("grant-letter-signed.pdf", "rb") as fh: r = requests.post( "https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments", headers={"Authorization": f"Bearer {os.environ['NP_TOKEN']}", "Idempotency-Key": "your-unique-key"}, files={"file": fh}, data={ "filename": "grant-letter-signed.pdf", "notes": "Signed copy received 21 Sep", "filedefinitionid": "8", "filecategory": "Receipts", }, ) r.raise_for_status()
import { openAsBlob } from 'node:fs';
const form = new FormData();
form.append('file', await openAsBlob('grant-letter-signed.pdf'), 'grant-letter-signed.pdf');
form.append('filename', "grant-letter-signed.pdf");
form.append('notes', "Signed copy received 21 Sep");
form.append('filedefinitionid', "8");
form.append('filecategory', "Receipts");
const res = await fetch(
'https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments',
{
method: 'POST',
headers: { Authorization: `Bearer ${process.env.NP_TOKEN}`, 'Idempotency-Key': 'your-unique-key' },
body: form,
}
);
const data = await res.json();
var token = Environment.GetEnvironmentVariable("NP_TOKEN"); using var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); using var form = new MultipartFormDataContent(); form.Add(new StreamContent(File.OpenRead("grant-letter-signed.pdf")), "file", "grant-letter-signed.pdf"); form.Add(new StringContent("grant-letter-signed.pdf"), "filename"); form.Add(new StringContent("Signed copy received 21 Sep"), "notes"); form.Add(new StringContent("8"), "filedefinitionid"); form.Add(new StringContent("Receipts"), "filecategory"); var req = new HttpRequestMessage(HttpMethod.Post, "https://acme.nolapro.com/!/api/v2/itemvendors/104/attachments") { Content = form }; req.Headers.Add("Idempotency-Key", "your-unique-key"); var res = await http.SendAsync(req); res.EnsureSuccessStatusCode();