{"openapi":"3.1.0","info":{"title":"Sendstack (BYOK) API","version":"0.1.0","description":"Sendstack (BYOK) lets an AI assistant read your own Sendstack data through the Sendstack API with a key you supply (Sendstack App ID). Read-only: 8 tools (get_wallet_balance, list_wallet_transactions, list_countries, list_mapped_locations, list_packaging_options, estimate_delivery_price, list_tracking_devices, list_geofences). The BYOK key travels with each request, is used for that one call only...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-sendstack.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-sendstack/docs"},"termsOfService":"https://connectorbay.com/byok-sendstack/terms"},"servers":[{"url":"https://byok-sendstack.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-sendstack/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_wallet_balance":{"post":{"operationId":"get_wallet_balance","summary":"Get the balance of the Sendstack wallet tied to your App ID (check it before booking deliveries). Use for \"How much is i","description":"Get the balance of the Sendstack wallet tied to your App ID (check it before booking deliveries). Use for \"How much is in my Sendstack wallet\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_wallet_balanceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_wallet_transactions":{"post":{"operationId":"list_wallet_transactions","summary":"List the wallet transactions (amount, description, DEBIT or CREDIT type, balance after and date), newest first as return","description":"List the wallet transactions (amount, description, DEBIT or CREDIT type, balance after and date), newest first as returned by Sendstack. Use for \"What did Sendstack charge my wallet recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"How many results to return (default 15).","title":"Limit"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_wallet_transactionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_countries":{"post":{"operationId":"list_countries","summary":"List the countries Sendstack has mapped, with their 2-letter country codes. Use for \"Which countries does Sendstack deli","description":"List the countries Sendstack has mapped, with their 2-letter country codes. Use for \"Which countries does Sendstack deliver to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_countriesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_mapped_locations":{"post":{"operationId":"list_mapped_locations","summary":"List the mapped delivery locations of a country by state, each with its location code (needed to request price estimates","description":"List the mapped delivery locations of a country by state, each with its location code (needed to request price estimates and deliveries) and availability. Use for \"What are the Sendstack location codes for Lagos\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"country":{"anyOf":[{"maxLength":2,"type":"string"},{"type":"null"}],"default":null,"description":"2-letter country code, for example NG.","title":"Country"}},"title":"list_mapped_locationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_packaging_options":{"post":{"operationId":"list_packaging_options","summary":"List the curated Sendstack packaging sizes (name, height, length, width) of items it can deliver. Use for \"What package ","description":"List the curated Sendstack packaging sizes (name, height, length, width) of items it can deliver. Use for \"What package sizes does Sendstack accept\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_packaging_optionsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/estimate_delivery_price":{"post":{"operationId":"estimate_delivery_price","summary":"Get delivery price offers between a pickup and a drop-off location by location code or latitude and longitude (a quote o","description":"Get delivery price offers between a pickup and a drop-off location by location code or latitude and longitude (a quote only: no booking is made and nothing is charged). Use for \"How much would Sendstack charge to deliver from Ajah to Yaba\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"pickup_location_code":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Pickup location code from list_mapped_locations.","title":"Pickup Location Code"},"pickup_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Pickup latitude (use with pickup_long instead of a location code).","title":"Pickup Lat"},"pickup_long":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Pickup longitude.","title":"Pickup Long"},"pickup_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Date scheduled for the pickup, for example 2026-05-20.","title":"Pickup Date"},"drop_location_code":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Drop-off location code from list_mapped_locations.","title":"Drop Location Code"},"drop_lat":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Drop-off latitude (use with drop_long instead of a location code).","title":"Drop Lat"},"drop_long":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Drop-off longitude.","title":"Drop Long"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Package weight in kg.","title":"Weight"},"length":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Package length in cm.","title":"Length"},"width":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Package width in cm.","title":"Width"},"height":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"description":"Package height in cm.","title":"Height"}},"title":"estimate_delivery_priceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tracking_devices":{"post":{"operationId":"list_tracking_devices","summary":"List the live-tracking devices on your account: name, type, online state, battery, lost flag and total distance (device ","description":"List the live-tracking devices on your account: name, type, online state, battery, lost flag and total distance (device serial numbers are left out). Use for \"Which Sendstack tracking devices are online\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_tracking_devicesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_geofences":{"post":{"operationId":"list_geofences","summary":"List the geofences defined on your Sendstack live-tracking account (name, description and polygon area). Use for \"Which ","description":"List the geofences defined on your Sendstack live-tracking account (name, description and polygon area). Use for \"Which geofences do I have in Sendstack\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_geofencesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}