openapi: 3.0.3
info:
title: Flowdock REST API
version: "1.0"
x-status: discontinued
x-shutdown-date: "2023-08-15"
description: |
Historical REST API surface for CA Flowdock, a team chat and shared-inbox
product originally built by Flowdock (Helsinki / Tampere, Finland), acquired
by CA Technologies (2013), and later operated under Broadcom. The product
and all hosted APIs were discontinued on August 15, 2023. Broadcom's
sunset notice recommended Microsoft Teams or Slack as successors.
This document is reconstructed from the public api-docs repository
(https://github.com/flowdock/api-docs) and archived copies of
https://www.flowdock.com/api on the Internet Archive
(https://web.archive.org/web/20211206180655/https://www.flowdock.com/api).
All endpoints below are now offline; this file exists for historical
and archival purposes.
contact:
name: Flowdock (discontinued)
url: https://github.com/flowdock/api-docs
license:
name: Documentation rights held by CA / Broadcom
servers:
- url: https://api.flowdock.com
description: Historical production base URL (offline since 2023-08-15)
tags:
- name: Flows
description: Team workspaces combining chat and a shared team inbox.
- name: Messages
description: Chat messages, comments, status, activity, discussion, and file events posted to a flow.
- name: Private Conversations
description: One-to-one direct message channels between two users.
- name: Private Messages
description: Messages within a private conversation.
- name: Users
description: User accounts that may belong to multiple organizations and flows.
- name: Organizations
description: Account-level container that owns flows and bills users.
- name: Sources
description: External integrations (GitHub, Jira, Zendesk, etc.) that post into a flow.
- name: Invitations
description: Open and accepted invitations to join a flow.
- name: Files
description: File uploads and downloads attached to messages.
- name: Threads
description: Threaded conversations rooted on a parent message.
- name: Authentication
description: OAuth 2.0 authorization-code grant for user delegation.
security:
- oauth2: []
- basicAuth: []
paths:
/oauth/authorize:
get:
tags: [Authentication]
summary: Begin OAuth 2.0 Authorization
operationId: oauthAuthorize
parameters:
- name: client_id
in: query
required: true
schema: { type: string }
- name: response_type
in: query
required: true
schema: { type: string, enum: [code] }
- name: redirect_uri
in: query
schema: { type: string, format: uri }
- name: scope
in: query
schema: { type: string, description: Space-delimited list of scopes (flow, private, profile). }
- name: state
in: query
schema: { type: string }
responses:
"302":
description: Redirect back to redirect_uri with an authorization code.
/oauth/token:
post:
tags: [Authentication]
summary: Exchange Authorization Code for Access Token
operationId: oauthToken
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [client_id, client_secret, code, redirect_uri, grant_type]
properties:
client_id: { type: string }
client_secret: { type: string }
code: { type: string }
redirect_uri: { type: string, format: uri }
grant_type: { type: string, enum: [authorization_code, refresh_token] }
refresh_token: { type: string }
responses:
"200":
description: Access token issued.
content:
application/json:
schema:
type: object
properties:
access_token: { type: string }
refresh_token: { type: string }
token_type: { type: string }
scope: { type: string }
/flows:
get:
tags: [Flows]
summary: List Flows For Authenticated User
operationId: listFlows
parameters:
- name: users
in: query
description: Set to 1 to include the list of users with each flow.
schema: { type: integer, enum: [0, 1] }
responses:
"200":
description: List of joined flows.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Flow" }
/flows/all:
get:
tags: [Flows]
summary: List All Flows Visible To User
operationId: listAllFlows
responses:
"200":
description: All flows the user can see (including organization-mode flows not joined).
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Flow" }
/flows/{organization}/{flow}:
get:
tags: [Flows]
summary: Get Flow
operationId: getFlow
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
responses:
"200":
description: Flow object.
content:
application/json:
schema: { $ref: "#/components/schemas/Flow" }
put:
tags: [Flows]
summary: Update Flow
operationId: updateFlow
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
open: { type: boolean }
access_mode: { type: string, enum: [invitation, link, organization] }
responses:
"200": { description: Updated flow. }
/flows/find:
get:
tags: [Flows]
summary: Get Flow By Id
operationId: getFlowById
parameters:
- name: id
in: query
required: true
schema: { type: string }
responses:
"200":
description: Flow object.
/flows/{organization}:
post:
tags: [Flows]
summary: Create Flow
operationId: createFlow
parameters:
- $ref: "#/components/parameters/Organization"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [name]
properties:
name: { type: string }
responses:
"201":
description: Flow created.
content:
application/json:
schema: { $ref: "#/components/schemas/Flow" }
/messages:
post:
tags: [Messages]
summary: Send Message
operationId: sendMessage
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/MessageInput" }
responses:
"201":
description: Message accepted.
content:
application/json:
schema: { $ref: "#/components/schemas/Message" }
/flows/{organization}/{flow}/messages:
get:
tags: [Messages]
summary: List Flow Messages
operationId: listFlowMessages
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: event
in: query
schema: { type: string, description: Filter by event type (message, status, comment, file, activity, discussion, message-edit, tag-change). }
- name: tags
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer, maximum: 100 }
- name: since_id
in: query
schema: { type: integer }
- name: until_id
in: query
schema: { type: integer }
responses:
"200":
description: List of message events.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Message" }
post:
tags: [Messages]
summary: Send Message To Flow
operationId: sendFlowMessage
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/MessageInput" }
responses:
"201": { description: Message accepted. }
/flows/{organization}/{flow}/messages/{id}:
get:
tags: [Messages]
summary: Show Message
operationId: showMessage
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"200":
description: Single message.
content:
application/json:
schema: { $ref: "#/components/schemas/Message" }
put:
tags: [Messages]
summary: Edit Message
operationId: editMessage
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
content: { type: string }
tags:
type: array
items: { type: string }
responses:
"200": { description: Message updated. }
delete:
tags: [Messages]
summary: Delete Message
operationId: deleteMessage
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"204": { description: Message deleted. }
/comments:
post:
tags: [Messages]
summary: Comment On Message
operationId: createComment
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [flow, message, content]
properties:
flow: { type: string }
message: { type: integer }
content: { type: string }
tags:
type: array
items: { type: string }
responses:
"201": { description: Comment posted. }
/flows/{organization}/{flow}/threads:
get:
tags: [Threads]
summary: List Flow Threads
operationId: listFlowThreads
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: application
in: query
schema: { type: string }
- name: limit
in: query
schema: { type: integer }
responses:
"200":
description: List of threads.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Thread" }
/flows/{organization}/{flow}/threads/{id}:
get:
tags: [Threads]
summary: Get Thread
operationId: getThread
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: string }
responses:
"200":
description: Thread object.
content:
application/json:
schema: { $ref: "#/components/schemas/Thread" }
/flows/{organization}/{flow}/threads/{id}/messages:
post:
tags: [Messages]
summary: Post Message To Thread
operationId: postThreadMessage
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: string }
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/MessageInput" }
responses:
"201": { description: Message posted to thread. }
/private:
get:
tags: [Private Conversations]
summary: List Private Conversations
operationId: listPrivateConversations
responses:
"200":
description: List of private conversations.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/PrivateConversation" }
/private/{id}:
get:
tags: [Private Conversations]
summary: Get Private Conversation
operationId: getPrivateConversation
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
"200":
description: Private conversation.
content:
application/json:
schema: { $ref: "#/components/schemas/PrivateConversation" }
put:
tags: [Private Conversations]
summary: Update Private Conversation
operationId: updatePrivateConversation
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
open: { type: boolean }
responses:
"200": { description: Conversation updated. }
/private/{id}/messages:
get:
tags: [Private Messages]
summary: List Private Messages
operationId: listPrivateMessages
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: limit
in: query
schema: { type: integer }
- name: since_id
in: query
schema: { type: integer }
- name: until_id
in: query
schema: { type: integer }
responses:
"200":
description: List of private messages.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Message" }
post:
tags: [Private Messages]
summary: Send Private Message
operationId: sendPrivateMessage
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema: { $ref: "#/components/schemas/MessageInput" }
responses:
"201": { description: Private message sent. }
/private/{id}/messages/{message_id}:
get:
tags: [Private Messages]
summary: Show Private Message
operationId: showPrivateMessage
parameters:
- name: id
in: path
required: true
schema: { type: integer }
- name: message_id
in: path
required: true
schema: { type: integer }
responses:
"200":
description: Single private message.
/users:
get:
tags: [Users]
summary: List All Visible Users
operationId: listUsers
responses:
"200":
description: List of users.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/User" }
/users/{id}:
get:
tags: [Users]
summary: Get User
operationId: getUser
parameters:
- name: id
in: path
required: true
schema: { type: integer }
responses:
"200":
description: User.
content:
application/json:
schema: { $ref: "#/components/schemas/User" }
put:
tags: [Users]
summary: Update User
operationId: updateUser
parameters:
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
nick: { type: string }
email: { type: string, format: email }
responses:
"200": { description: User updated. }
/flows/{organization}/{flow}/users:
get:
tags: [Users]
summary: List Flow Users
operationId: listFlowUsers
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
responses:
"200":
description: List of flow users.
post:
tags: [Users]
summary: Add User To Flow
operationId: addUserToFlow
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [id]
properties:
id: { type: integer }
responses:
"200": { description: User added to flow. }
/flows/{organization}/{flow}/users/{id}:
delete:
tags: [Users]
summary: Remove User From Flow
operationId: removeUserFromFlow
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"204": { description: User removed. }
/organizations:
get:
tags: [Organizations]
summary: List Organizations
operationId: listOrganizations
responses:
"200":
description: List of organizations.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Organization" }
/organizations/{parameterized_name}:
get:
tags: [Organizations]
summary: Get Organization
operationId: getOrganization
parameters:
- name: parameterized_name
in: path
required: true
schema: { type: string }
responses:
"200":
description: Organization.
content:
application/json:
schema: { $ref: "#/components/schemas/Organization" }
put:
tags: [Organizations]
summary: Update Organization
operationId: updateOrganization
parameters:
- name: parameterized_name
in: path
required: true
schema: { type: string }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
parameterized_name: { type: string }
responses:
"200": { description: Organization updated. }
/organizations/{organization}/users/{id}:
delete:
tags: [Users]
summary: Remove User From Organization
operationId: removeUserFromOrganization
parameters:
- $ref: "#/components/parameters/Organization"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"204": { description: User removed. }
/sources:
get:
tags: [Sources]
summary: List Sources
operationId: listSources
responses:
"200":
description: List of sources visible to the user.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Source" }
/flows/{organization}/{flow}/sources:
get:
tags: [Sources]
summary: List Flow Sources
operationId: listFlowSources
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
responses:
"200":
description: List of sources attached to the flow.
post:
tags: [Sources]
summary: Create Source
operationId: createSource
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [name]
properties:
name: { type: string }
external_url: { type: string, format: uri }
responses:
"201":
description: Source created.
content:
application/json:
schema: { $ref: "#/components/schemas/Source" }
/flows/{organization}/{flow}/sources/{id}:
get:
tags: [Sources]
summary: Get Source
operationId: getSource
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"200": { description: Source. }
put:
tags: [Sources]
summary: Update Source
operationId: updateSource
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name: { type: string }
external_url: { type: string, format: uri }
responses:
"200": { description: Source updated. }
delete:
tags: [Sources]
summary: Delete Source
operationId: deleteSource
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"204": { description: Source deleted. }
/flows/{organization}/{flow}/invitations:
get:
tags: [Invitations]
summary: List Flow Invitations
operationId: listInvitations
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
responses:
"200":
description: List of pending and accepted invitations.
content:
application/json:
schema:
type: array
items: { $ref: "#/components/schemas/Invitation" }
post:
tags: [Invitations]
summary: Create Invitation
operationId: createInvitation
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [email]
properties:
email: { type: string, format: email }
message: { type: string }
responses:
"201":
description: Invitation created.
content:
application/json:
schema: { $ref: "#/components/schemas/Invitation" }
/flows/{organization}/{flow}/invitations/{id}:
get:
tags: [Invitations]
summary: Get Invitation
operationId: getInvitation
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"200":
description: Invitation.
delete:
tags: [Invitations]
summary: Delete Invitation
operationId: deleteInvitation
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
- name: id
in: path
required: true
schema: { type: integer }
responses:
"204": { description: Invitation revoked. }
/flows/{organization}/{flow}/invitations/import:
post:
tags: [Invitations]
summary: Import Address List
operationId: importInvitations
parameters:
- $ref: "#/components/parameters/Organization"
- $ref: "#/components/parameters/FlowName"
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [addresses]
properties:
addresses:
type: array
items: { type: string, format: email }
message: { type: string }
responses:
"200": { description: Addresses imported. }
/files/{organization}/{hash}/{filename}:
get:
tags: [Files]
summary: Download File
operationId: downloadFile
parameters:
- name: organization
in: path
required: true
schema: { type: integer, description: Numeric organization id used in file paths. }
- name: hash
in: path
required: true
schema: { type: string }
- name: filename
in: path
required: true
schema: { type: string }
responses:
"302":
description: Redirect to a short-lived S3 download URL.
headers:
Location:
schema: { type: string, format: uri }
components:
parameters:
Organization:
name: organization
in: path
required: true
description: Organization parameterized name.
schema: { type: string }
FlowName:
name: flow
in: path
required: true
description: Flow parameterized name within the organization.
schema: { type: string }
securitySchemes:
oauth2:
type: oauth2
flows:
authorizationCode:
authorizationUrl: https://api.flowdock.com/oauth/authorize
tokenUrl: https://api.flowdock.com/oauth/token
scopes:
flow: Read and write flow content.
private: Read and write private conversations.
profile: Read user profile.
basicAuth:
type: http
scheme: basic
description: Email + password, or personal API token as the username.
schemas:
Flow:
type: object
properties:
id: { type: string }
name: { type: string }
parameterized_name: { type: string }
organization: { $ref: "#/components/schemas/Organization" }
unread_mentions: { type: integer }
open: { type: boolean }
joined: { type: boolean }
url: { type: string, format: uri }
web_url: { type: string, format: uri }
join_url: { type: string, format: uri }
access_mode:
type: string
enum: [invitation, link, organization]
MessageInput:
type: object
required: [event, content]
properties:
event:
type: string
enum: [message, status, comment, action, activity, discussion, file]
content:
oneOf:
- type: string
- type: object
flow: { type: string }
message: { type: integer }
tags:
type: array
items: { type: string }
external_user_name: { type: string }
uuid: { type: string }
thread_id: { type: string }
external_thread_id: { type: string }
Message:
type: object
properties:
id: { type: integer }
app: { type: string }
event: { type: string }
flow: { type: string }
content: {}
sent: { type: integer, format: int64 }
user: { type: string }
created_at: { type: string, format: date-time }
tags:
type: array
items: { type: string }
attachments:
type: array
items: { type: object }
thread_id: { type: string }
thread: { $ref: "#/components/schemas/Thread" }
uuid: { type: string }
Thread:
type: object
properties:
id: { type: string }
title: { type: string }
body: { type: string }
status:
type: object
properties:
color: { type: string }
value: { type: string }
fields:
type: array
items:
type: object
properties:
label: { type: string }
value: { type: string }
actions:
type: array
items: { type: object }
external_url: { type: string, format: uri }
actor:
type: object
properties:
name: { type: string }
avatar: { type: string, format: uri }
User:
type: object
properties:
id: { type: integer }
email: { type: string, format: email }
name: { type: string }
nick: { type: string }
avatar: { type: string, format: uri }
website: { type: string, format: uri }
admin: { type: boolean }
Organization:
type: object
properties:
id: { type: integer }
parameterized_name: { type: string }
name: { type: string }
user_limit: { type: integer }
user_count: { type: integer }
active: { type: boolean }
url: { type: string, format: uri }
subscription:
type: object
properties:
trial: { type: boolean }
trial_ends: { type: string, format: date }
billing_date: { type: string, format: date }
Source:
type: object
properties:
id: { type: integer }
name: { type: string }
url: { type: string, format: uri }
external_url: { type: string, format: uri }
created_at: { type: string, format: date-time }
updated_at: { type: string, format: date-time }
application:
type: object
properties:
id: { type: integer }
name: { type: string }
icon_url: { type: string, format: uri }
url: { type: string, format: uri }
creator: { $ref: "#/components/schemas/User" }
Invitation:
type: object
properties:
id: { type: integer }
state: { type: string, enum: [pending, accepted] }
email: { type: string, format: email }
flow: { type: string }
url: { type: string, format: uri }
PrivateConversation:
type: object
properties:
id: { type: integer }
url: { type: string, format: uri }
name: { type: string }
open: { type: boolean }
activity:
type: object
properties:
inbox: { type: boolean }
mentions: { type: integer }
chat: { type: boolean }
users:
type: array
items: { $ref: "#/components/schemas/User" }