{"openapi":"3.1.0","info":{"title":"Portable (BYOK) API","version":"0.1.0","description":"Portable (BYOK) lets an AI assistant read your own Portable data through the Portable API with a key you supply (Portable API key). Read-only: 12 tools (list_source_specs, list_sources, get_source, list_destinations, get_destination, list_flows, get_flow, get_flow_status, list_flow_run_attempts, list_workflows, get_workflow_status, list_workflow_runs). The BYOK key travels with each request, is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-portable.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-portable/docs"},"termsOfService":"https://connectorbay.com/byok-portable/terms"},"servers":[{"url":"https://byok-portable.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-portable/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/list_source_specs":{"post":{"operationId":"list_source_specs","summary":"List the source types Portable can connect to with display name, release stage (alpha, beta, stable) and authentication ","description":"List the source types Portable can connect to with display name, release stage (alpha, beta, stable) and authentication strategy. Use for \"Does Portable have a connector for HubSpot\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_source_specsArguments","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_sources":{"post":{"operationId":"list_sources","summary":"List the sources you configured (a source is one connection to a system you pull data from) with name, type and dates. U","description":"List the sources you configured (a source is one connection to a system you pull data from) with name, type and dates. Use for \"Which sources are configured in Portable\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_sourcesArguments","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/get_source":{"post":{"operationId":"get_source","summary":"Get one source with its type details; connection properties and credentials are not returned. Use for \"Show Portable sou","description":"Get one source with its type details; connection properties and credentials are not returned. Use for \"Show Portable source 12\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the source.","title":"Id","type":"integer"}},"required":["id"],"title":"get_sourceArguments","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_destinations":{"post":{"operationId":"list_destinations","summary":"List the destinations (warehouses and databases data is loaded into) with name, type and dates. Use for \"Which destinati","description":"List the destinations (warehouses and databases data is loaded into) with name, type and dates. Use for \"Which destinations does Portable load into\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_destinationsArguments","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/get_destination":{"post":{"operationId":"get_destination","summary":"Get one destination with its type details; connection properties and credentials are not returned. Use for \"Show Portabl","description":"Get one destination with its type details; connection properties and credentials are not returned. Use for \"Show Portable destination 3\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the destination.","title":"Id","type":"integer"}},"required":["id"],"title":"get_destinationArguments","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_flows":{"post":{"operationId":"list_flows","summary":"List flows (a flow moves data from one source to one destination) with schedule, enabled state and dates. Use for \"Which","description":"List flows (a flow moves data from one source to one destination) with schedule, enabled state and dates. Use for \"Which Portable flows are disabled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_flowsArguments","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/get_flow":{"post":{"operationId":"get_flow","summary":"Get one flow: source and destination ids, schedule, disabled flag and dates. Use for \"How often does Portable flow 56897","description":"Get one flow: source and destination ids, schedule, disabled flag and dates. Use for \"How often does Portable flow 568971 run\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the flow.","title":"Id","type":"integer"}},"required":["id"],"title":"get_flowArguments","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/get_flow_status":{"post":{"operationId":"get_flow_status","summary":"Get whether a flow is running and how its last run ended, with per-resource extracted, analyzed and loaded counts and er","description":"Get whether a flow is running and how its last run ended, with per-resource extracted, analyzed and loaded counts and errors. Use for \"Did the last run of Portable flow 568971 succeed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the flow.","title":"Id","type":"integer"}},"required":["id"],"title":"get_flow_statusArguments","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_flow_run_attempts":{"post":{"operationId":"list_flow_run_attempts","summary":"List run attempts of a flow with trigger, status, errors and times, newest first by default. Use for \"Show the recent ru","description":"List run attempts of a flow with trigger, status, errors and times, newest first by default. Use for \"Show the recent run attempts of Portable flow 568971\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the flow.","title":"Id","type":"integer"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many run attempts to return (1 to 1000, default 100).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many run attempts to skip.","title":"Offset"},"sort":{"anyOf":[{"enum":["ASC","DESC"],"type":"string"},{"type":"null"}],"default":"DESC","description":"Order by creation time: ASC or DESC.","title":"Sort"},"start_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only attempts from this time on (RFC 3339, for example 2026-10-01T00:00:00Z).","title":"Start Time"},"end_time":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only attempts up to this time (RFC 3339).","title":"End Time"}},"required":["id"],"title":"list_flow_run_attemptsArguments","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_workflows":{"post":{"operationId":"list_workflows","summary":"List workflows with name, description, enabled state and schedule; the workflow definition itself is not returned. Use f","description":"List workflows with name, description, enabled state and schedule; the workflow definition itself is not returned. Use for \"Which Portable workflows are enabled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_workflowsArguments","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/get_workflow_status":{"post":{"operationId":"get_workflow_status","summary":"Get whether a workflow is running and how its last run ended, with per-resource counts and errors. Use for \"Did Portable","description":"Get whether a workflow is running and how its last run ended, with per-resource counts and errors. Use for \"Did Portable workflow 7 finish successfully\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the workflow.","title":"Id","type":"integer"}},"required":["id"],"title":"get_workflow_statusArguments","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_workflow_runs":{"post":{"operationId":"list_workflow_runs","summary":"List runs of a workflow with status, start and completion time and an error summary. Use for \"Show recent runs of Portab","description":"List runs of a workflow with status, start and completion time and an error summary. Use for \"Show recent runs of Portable workflow 7\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"Numeric id of the workflow.","title":"Id","type":"integer"},"limit":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many runs to return (1 to 500).","title":"Limit"}},"required":["id"],"title":"list_workflow_runsArguments","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}}}}