What happens if…?
Docs usually tell you the happy path. This page tells you what happens down the other branch — the retry, the duplicate, the delete, the misconfigured receiver. Each answer links its source. [GAP] marks the questions the documentation cannot answer yet; if one blocks you, ask support@upwell.com.Writes and retries
…I POST the same customer / shipment / invoice twice?
…I POST the same customer / shipment / invoice twice?
POST fails with 400 Uniqueness violation on the
(sourceSystem, sourceSystemId) pair. First sync is POST, every later change is PUT.
Source: Idempotency & retries.…I POST the same carrier twice?
…I POST the same carrier twice?
name,
email, phone, or anything else you sent. If you meant to update, use PUT. Source:
Syncing foundation entities.…I POST the same carrier invoice twice (e.g. a retry after a timeout)?
…I POST the same carrier invoice twice (e.g. a retry after a timeout)?
(tenant, sourceSystemId) — note: not scoped by
integration, so two integrations reusing id strings collide. The id your retry returned may
be the deleted one; reconcile by looking the invoice up by sourceSystemId afterward.
Source: Re-submitting. One caveat on
the lookup itself — see filtering a list below.…I re-request a presigned upload URL for the same document pair?
…I re-request a presigned upload URL for the same document pair?
400 DOCUMENT_ALREADY_UPLOADED — synchronous, unlike carrier invoices.
Exception: re-requesting one whose upload never completed returns a fresh URL for the same
document. Source: Purchase orders & vendor invoices.…a duplicate sneaks into a bulk batch?
…a duplicate sneaks into a bulk batch?
bulk-carriers: the entire batch fails (no upsert). bulk-bills: upserts like its
singular endpoint. Neither reports partial success. What the failure response tells you
about which row broke the batch: [GAP]. Source:
Syncing foundation entities.…I send money as dollars-and-cents floats?
…I send money as dollars-and-cents floats?
"The value 2847.5 lies outside the bounds or is not an integer." All
monetary fields are integer cents. Source: Money & payloads.…I omit a required field that has no server default?
…I omit a required field that has no server default?
400 with the column name in a flat error string, e.g. "Not-NULL violation. null value in column \"shipment_id\"…". Known cases: shipments.shipmentId, invoices.balance — the
OpenAPI spec marks these required, so generated clients catch them before the wire.
Source: Integration patterns.Errors, limits, and the reference
…a call fails — what shape is the error?
…a call fails — what shape is the error?
{"error": "<message>"}, sometimes with a code such as
constraint-violation or bad-request. An invalid or missing API key returns 401 with an
empty body. There is no nested error envelope. The message→fix table lives in
Error handling.…I exceed the rate limit?
…I exceed the rate limit?
429, no X-RateLimit-* headers,
no Retry-After. A 429 you observe came from your own proxy or gateway. Design your
client politely (bounded concurrency, backoff on 5xx), but don’t build 429 machinery.
Source: Error handling.…I generate a client from the published OpenAPI spec?
…I generate a client from the published OpenAPI spec?
ApiKeyAuth in the Authorization header), the
machine-enforced required fields, the real UPPER_SNAKE_CASE status enums, the nested
invoiceShipments insert, and generic 400/401 responses. One remaining caveat: the
where/orderBy filters that some list GETs accept are not in the spec — pending
verification of the query-string transport. [GAP — verification in progress] Prefer the
POST /search endpoints for filtering.Reading data back
…I GET a list endpoint with no parameters?
…I GET a list endpoint with no parameters?
limit is 10 (a handful of endpoints default
to 100). Nothing marks the response as truncated. Always pass limit/offset explicitly.
Source: API conventions.…I need to filter a list server-side?
…I need to filter a list server-side?
POST /<resource>/searchexists for customers, carriers, shipments, shipment line items, invoices, bills, bill payments, customer payments (+ line items), vendors, purchase orders, vendor invoices — use it (Integration patterns).- Addresses and companies have no search — page the collection or go through the parent.
- A
?where=JSON filter on list GETs: the underlying queries accept it, but whether the GET query-string transport parses object-typed params is still being verified — [GAP — verification in progress]. Until it’s confirmed, usePOST /searchwhere it exists.
…I try to read back an address I created nested under a company?
…I try to read back an address I created nested under a company?
POST /api/rest/companies returns no address
ids), companies expose no address read path, and addresses carry no external key — the row
is recoverable only by paging GET /api/rest/addresses. Create company addresses standalone
instead. Source: Working with addresses.Deletes
…I DELETE a customer?
…I DELETE a customer?
PUT with deletedAt), which frees the key equally.
A dedicated “deactivate” mechanism beyond soft delete is not documented. [GAP] Source:
Deleting and archiving.…I DELETE a company?
…I DELETE a company?
…I DELETE a vendor that still has bills?
…I DELETE a vendor that still has bills?
…I DELETE a rule I might want back?
…I DELETE a rule I might want back?
enabled: false instead. Source:
Rules.Webhooks misbehaving
…my receiver returns 5xx or times out?
…my receiver returns 5xx or times out?
5xx, timeouts, and network failures all count — up to the
subscription’s retryAttempts, with exponential backoff (1 min, 2 min, 4 min, …).
retryAttempts: 3 (the default) means up to 4 total deliveries. Each attempt has a
15-second timeout — ack fast, work async. Source:
Outbound webhooks.…my receiver returns 4xx (bad auth config, wrong route)?
…my receiver returns 4xx (bad auth config, wrong route)?
…I miss deliveries entirely (outage on my side)?
…I miss deliveries entirely (outage on my side)?
GET /carrier_invoices/{id} etc.), which the
status guide recommends running periodically anyway.
Source: Outbound webhooks, Reliability.…I subscribe to update.carrier_invoice expecting every change?
…I subscribe to update.carrier_invoice expecting every change?
APPROVED) fires only update.carrier_invoice.status.APPROVED, not
also the generic update.carrier_invoice. Subscribe to every trigger you care about.
Source: Webhook event catalog.…I want carrier-document or customer-invoice-APPROVED events?
…I want carrier-document or customer-invoice-APPROVED events?
create/update/delete.carrier_document,
update.invoice.status.APPROVED) exist in the dispatcher but are not self-service —
they’re marked † in the event catalog; contact support to
enable them.…a customer/carrier/shipment changes inside Upwell?
…a customer/carrier/shipment changes inside Upwell?
Lifecycle surprises
…my new carrier invoice immediately shows exceptions?
…my new carrier invoice immediately shows exceptions?
updatedAt > createdAt before judging
exceptions. Source: Carrier invoice status.…an invoice sits in a status my table doesn't list?
…an invoice sits in a status my table doesn't list?
AWAITING_BILL,
CANCELLED, and REFUNDED are currently undefined in prose. [GAP — definitions needed]…an approval request is resolved FAILED?
…an approval request is resolved FAILED?
REJECTED? EXCEPTION?) is not
documented. [GAP] Source: How approvals work,
Responding to approval requests.…a clean invoice isn't auto-approving?
…a clean invoice isn't auto-approving?
…I apply a customer payment via the API — does the invoice update itself?
…I apply a customer payment via the API — does the invoice update itself?
balance/status; your integration updates the invoice afterward. (Upwell’s own internal
payment pipelines do update invoices — which is why payments recorded inside Upwell behave
differently.) Source: Customer invoices (Tip),
Remittances.…I upload a rate confirmation with the wrong documentType?
…I upload a rate confirmation with the wrong documentType?
CUSTOMER_RATE_CONFIRMATION pollutes customer-side validation and vice versa. Re-type and
re-process rather than editing amounts; never let carrier cost reach the customer side.
Source: Document conventions.…I save an address that never shows up in the app?
…I save an address that never shows up in the app?
type problem: pages render only specific types (CUSTOMER_BILLING,
COMPANY_ADDRESS), and ADDRESS_BOOK is read by nothing. The write succeeded; the page
filtered it out. Debug order and per-page field lists:
Working with addresses.
