{"openapi":"3.1.1","info":{"title":"Analytics","description":"Productboard API v2 for listing analytics and member activity data. Use these endpoints to list member activities with optional date filtering and pagination.","version":"2.0.0","contact":{"name":"Productboard Support","url":"https://support.productboard.com","email":"support@productboard.com"},"license":{"name":"Productboard Proprietary","url":"https://www.productboard.com/"}},"servers":[{"url":"https://api.productboard.com/v2","description":"Production server"}],"security":[{"BearerAuth":[]},{"OAuth2":["analytics:read"]}],"tags":[{"name":"analytics","description":"Analytics API endpoints."}],"paths":{"/analytics/member-activities":{"get":{"tags":["analytics"],"summary":"List member activities","description":"Lists member activity data with optional date filtering and pagination.\nReturns a list of member activity records.\n","operationId":"listMemberActivities","security":[{"BearerAuth":["analytics:read"]}],"parameters":[{"name":"dateFrom","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Start date for filtering activity data (ISO 8601 format)","example":"2025-10-01"},{"name":"dateTo","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"End date for filtering activity data (ISO 8601 format)","example":"2025-10-31"},{"name":"pageCursor","in":"query","required":false,"schema":{"type":"string"},"description":"Cursor for pagination to get the next page of results"}],"responses":{"200":{"$ref":"#/components/responses/MemberActivityListResponse"},"400":{"$ref":"#/components/responses/BadRequestResponse"},"401":{"$ref":"#/components/responses/UnauthorizedResponse"},"403":{"$ref":"#/components/responses/ForbiddenResponse"},"408":{"$ref":"#/components/responses/RequestTimeoutResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorResponse"}}}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"API token authentication. Use your API token as the value of the Authorization header"},"OAuth2":{"type":"oauth2","description":"OAuth 2.0 authentication. Use this for user-authorized access to Productboard API.","flows":{"authorizationCode":{"authorizationUrl":"https://app.productboard.com/oauth/authorize","tokenUrl":"https://app.productboard.com/oauth/token","scopes":{"analytics:read":"Read access to analytics data"}}}}},"responses":{"MemberActivityListResponse":{"description":"A paginated list of member activities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberActivityList"},"examples":{"memberActivitiesList":{"summary":"List of member activities","value":{"data":[{"date":"2025-10-01","domain":"acme-corp","memberId":"123e4567-e89b-12d3-a456-426614174000","role":"admin","activeFlag":true,"boardCreatedCount":5,"boardOpenedCount":16,"componentCreatedCount":3,"featureCreatedCount":1,"insightCreatedCount":4,"noteCreatedCount":7,"productCreatedCount":1,"subfeatureCreatedCount":2,"noteStateChangedCount":3,"gridBoardCreatedCount":1,"timelineBoardCreatedCount":1,"insightsBoardCreatedCount":1,"documentBoardCreatedCount":1,"columnBoardCreatedCount":1,"gridBoardOpenedCount":5,"timelineBoardOpenedCount":4,"insightsBoardOpenedCount":3,"documentBoardOpenedCount":2,"columnBoardOpenedCount":2}],"links":{"next":"https://api.productboard.com/v2/analytics/member-activities?pageCursor=eyJsYXN0SWQiOiIxMjM0NTY3ODkwIn0"}}},"memberActivitiesLastPage":{"summary":"Last page (no next cursor)","value":{"data":[{"date":"2025-10-31","domain":"acme-corp","memberId":"123e4567-e89b-12d3-a456-426614174000","role":"maker","activeFlag":false,"boardCreatedCount":0,"boardOpenedCount":1,"componentCreatedCount":0,"featureCreatedCount":0,"insightCreatedCount":0,"noteCreatedCount":0,"productCreatedCount":0,"subfeatureCreatedCount":0,"noteStateChangedCount":0,"gridBoardCreatedCount":0,"timelineBoardCreatedCount":0,"insightsBoardCreatedCount":0,"documentBoardCreatedCount":0,"columnBoardCreatedCount":0,"gridBoardOpenedCount":0,"timelineBoardOpenedCount":1,"insightsBoardOpenedCount":0,"documentBoardOpenedCount":0,"columnBoardOpenedCount":0}],"links":{"next":null}}}}}}},"BadRequestResponse":{"description":"Bad Request - Invalid input format or malformed request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"schemaInvalid":{"summary":"Request does not satisfy schema","value":{"id":"req-1234567890","errors":[{"code":"request.invalid","title":"Request schema invalid","detail":"The request does not satisfy the required schema. Field 'type' is required but was not provided.","source":{"pointer":"/data/type"}}]}},"fieldInvalid":{"summary":"Invalid field value type","value":{"id":"req-1234567891","errors":[{"code":"request.invalid","title":"Request schema invalid","detail":"Field 'fields/name' must be a string with maximum length of 255 characters, but received a number.","source":{"pointer":"/data/fields/name"}}]}},"malformedJson":{"summary":"Malformed JSON syntax","value":{"id":"req-1234567892","errors":[{"code":"request.malformed","title":"Request malformed","detail":"The request body contains invalid JSON syntax. Expected ',' or '}' at line 5, column 12."}]}},"invalidContentType":{"summary":"Invalid content type","value":{"id":"req-1234567893","errors":[{"code":"request.malformed","title":"Request malformed","detail":"The Content-Type header must be 'application/json'. Received 'text/plain'."}]}}}}}},"UnauthorizedResponse":{"description":"Unauthorized - Missing or invalid authentication credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"missingCredentials":{"summary":"Missing authentication credentials","value":{"id":"req-2234567890","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"Authentication credentials are missing."}]}},"invalidToken":{"summary":"Invalid or expired token","value":{"id":"req-2234567891","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"The provided authentication credentials are invalid or have expired. Please obtain new credentials and try again."}]}},"revokedCredentials":{"summary":"Revoked credentials","value":{"id":"req-2234567892","errors":[{"code":"auth.invalid","title":"Invalid authentication","detail":"The authentication credentials have been revoked. Please contact your workspace administrator."}]}}}}}},"ForbiddenResponse":{"description":"Forbidden - Insufficient permissions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"permissionDenied":{"summary":"Permission denied for resource","value":{"id":"req-3234567890","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"You do not have permission to perform this operation on the specified resource. Contact your workspace administrator to request access."}]}},"insufficientScope":{"summary":"Insufficient OAuth scopes","value":{"id":"req-3234567891","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"Your authentication token lacks the required OAuth scopes to perform this operation. Please re-authenticate with the necessary scopes."}]}},"readOnlyRole":{"summary":"Read-only role restriction","value":{"id":"req-3234567892","errors":[{"code":"auth.accessDenied","title":"Access denied","detail":"Your user role does not permit this operation. Please contact your workspace administrator."}]}}}}}},"RequestTimeoutResponse":{"description":"Request Timeout - The server did not receive a complete request within the allowed time","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"requestTimeout":{"summary":"Request timeout","value":{"id":"req-5234567890","errors":[{"code":"request.timeout","title":"Request timeout","detail":"The request took too long to process and was terminated. Try simplifying your request or try again later."}]}}}}}},"TooManyRequestsResponse":{"description":"Too Many Requests - API rate limit exceeded, reduce request frequency and retry after the indicated time","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"rateLimitExceeded":{"summary":"Rate limit exceeded","value":{"id":"req-7234567890","errors":[{"code":"rate.limitExceeded","title":"Rate limit exceeded","detail":"You have exceeded the allowed number of API requests. Please wait before making additional requests."}]}}}}}},"InternalServerErrorResponse":{"description":"Internal Server Error - An unexpected error occurred on the server, please retry or contact support","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"internalServerError":{"summary":"Unexpected server error","value":{"id":"req-8234567890","errors":[{"code":"internal.serverError","title":"Internal server error","detail":"An unexpected error occurred while processing your request. Please try again later. If the problem persists, contact support with the correlation ID."}]}}}}}}},"schemas":{"MemberActivityList":{"type":"object","required":["data","links"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MemberActivityPayload"}},"links":{"$ref":"#/components/schemas/ListLinks"}}},"MemberActivityPayload":{"type":"object","description":"Represents a member activity record with activity details and metadata.\n","required":["date","domain","memberId","role","activeFlag"],"properties":{"date":{"$ref":"#/components/schemas/DateFieldValue","description":"Date of the activity"},"domain":{"type":"string","description":"Domain identifier for the space","example":"acme-corp"},"memberId":{"$ref":"#/components/schemas/UUID","description":"ID of the member who performed the activity"},"role":{"type":"string","description":"Role of the member who performed the activity","example":"admin"},"activeFlag":{"$ref":"#/components/schemas/BooleanFieldValue","description":"Whether the member is active"},"boardCreatedCount":{"type":"integer","minimum":0,"description":"Number of boards created by the member on this date","example":2},"boardOpenedCount":{"type":"integer","minimum":0,"description":"Number of boards opened by the member on this date","example":5},"componentCreatedCount":{"type":"integer","minimum":0,"description":"Number of components created by the member on this date","example":3},"featureCreatedCount":{"type":"integer","minimum":0,"description":"Number of features created by the member on this date","example":1},"insightCreatedCount":{"type":"integer","minimum":0,"description":"Number of insights created by the member on this date","example":4},"noteCreatedCount":{"type":"integer","minimum":0,"description":"Number of notes created by the member on this date","example":7},"productCreatedCount":{"type":"integer","minimum":0,"description":"Number of products created by the member on this date","example":1},"subfeatureCreatedCount":{"type":"integer","minimum":0,"description":"Number of subfeatures created by the member on this date","example":2},"noteStateChangedCount":{"type":"integer","minimum":0,"description":"Number of note state changes by the member on this date","example":3},"gridBoardCreatedCount":{"type":"integer","minimum":0,"description":"Number of grid/prioritization boards created by the member on this date","example":1},"timelineBoardCreatedCount":{"type":"integer","minimum":0,"description":"Number of timeline roadmap boards created by the member on this date","example":1},"insightsBoardCreatedCount":{"type":"integer","minimum":0,"description":"Number of insights boards created by the member on this date","example":1},"documentBoardCreatedCount":{"type":"integer","minimum":0,"description":"Number of document boards created by the member on this date","example":1},"columnBoardCreatedCount":{"type":"integer","minimum":0,"description":"Number of column roadmap boards created by the member on this date","example":1},"gridBoardOpenedCount":{"type":"integer","minimum":0,"description":"Number of grid/prioritization boards opened by the member on this date","example":5},"timelineBoardOpenedCount":{"type":"integer","minimum":0,"description":"Number of timeline boards opened by the member on this date","example":4},"insightsBoardOpenedCount":{"type":"integer","minimum":0,"description":"Number of insights/inbox/analytics boards opened by the member on this date","example":3},"documentBoardOpenedCount":{"type":"integer","minimum":0,"description":"Number of document boards opened by the member on this date","example":2},"columnBoardOpenedCount":{"type":"integer","minimum":0,"description":"Number of column boards opened by the member on this date","example":2}}},"DateFieldValue":{"type":"string","format":"date","description":"Date and time in ISO 8601 format without time.\n","example":"2025-10-01"},"BooleanFieldValue":{"type":"boolean","description":"Boolean value or flag. In the UI, it is usually represented as a single checkbox.\n","example":true},"UUID":{"type":"string","format":"uuid","description":"A universally unique identifier (UUID).\n","example":"123e4567-e89b-12d3-a456-426614174000"},"ListLinks":{"type":"object","required":["next"],"properties":{"next":{"type":["string","null"]}}},"ErrorSource":{"type":"object","description":"An object containing references to the source of the error. It helps with location of the problematic field or parameter.\n","properties":{"pointer":{"type":"string","description":"JSON Pointer [RFC6901] to the associated entity in the request document.\n","example":"/data/fields/status"},"parameter":{"type":"string","description":"Query parameter causing the error.\nUsed when the error is related to a query parameter rather than request body.\n","example":"pageCursor"}}},"Error":{"type":"object","description":"Individual error object containing the details and context.\n","required":["code","title","detail"],"properties":{"code":{"type":"string","description":"A unique, machine-readable and stable code that identifies this error.\nMust be consistent across all services and provide clear categorization.\nFormat: `category.subcategory.specificError`\n","examples":["auth.accessDenied","resource.notFound"]},"title":{"type":"string","description":"A short, human-readable summary of the problem that doesn't change\nfrom occurrence to occurrence of the problem. Should provide immediate\nunderstanding of the error type.\n","maxLength":255,"example":"Missing required field"},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem.\nMay include suggestions for resolution but should not expose sensitive information.\n","maxLength":1000,"example":"Field 'status' is required."},"source":{"$ref":"#/components/schemas/ErrorSource"}}},"ErrorResponse":{"type":"object","description":"Standard error response structure.\n","required":["id","errors"],"properties":{"id":{"type":"string","description":"A unique identifier for this specific occurrence of the problem.\nIt carries unique request/response ID which allows client\nand server to reference the exact instance of the error\nin logs or support communication.\n"},"errors":{"type":"array","description":"Array of error objects, multiple errors can be returned.","items":{"$ref":"#/components/schemas/Error"},"minItems":1}}}}},"x-readme":{"samples-languages":["shell","javascript","ruby"]}}