openapi: 3.2.0 info: title: Relm CRM Pipelines API version: 0.17.1 summary: API-first CRM built for LLMs and AI agents. description: REST surface for Relm. contact: name: Relm url: https://relmcrm.com/ license: name: Proprietary servers: - url: https://api.relmcrm.com/v1 description: Production security: - bearerAuth: [] - oauth2: - crm tags: - name: Pipelines paths: /pipelines: get: tags: - Pipelines operationId: listPipelines summary: List pipelines with their ordered stages responses: '200': description: Pipelines content: application/json: schema: type: object default: $ref: '#/components/responses/Problem' post: tags: - Pipelines operationId: createPipeline summary: Create a pipeline requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PipelineInput' responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' /pipelines/{key}: parameters: - name: key in: path required: true schema: type: string description: Pipeline key or pl_ id. get: tags: - Pipelines operationId: getPipeline summary: Fetch a pipeline responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' patch: tags: - Pipelines operationId: updatePipeline summary: 'Update a pipeline: display `name`, `is_default`, and/or re-`key` it.' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: New display name key: type: string description: New pipeline key (slugified); deals follow by internal id. is_default: type: boolean responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' delete: tags: - Pipelines operationId: deletePipeline summary: Delete a pipeline (fails if deals still use it) responses: '200': description: Deleted content: application/json: schema: $ref: '#/components/schemas/Deleted' default: $ref: '#/components/responses/Problem' /pipelines/{key}/default: parameters: - name: key in: path required: true schema: type: string post: tags: - Pipelines operationId: setDefaultPipeline summary: Make this pipeline the workspace default responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' /pipelines/{key}/stages: parameters: - name: key in: path required: true schema: type: string post: tags: - Pipelines operationId: addStage summary: Add a stage to a pipeline requestBody: required: true content: application/json: schema: type: object required: - key properties: key: type: string description: Slugified on write; original kept as label. label: type: string ordinal: type: integer type: type: string enum: - open - won - lost responses: '201': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' /pipelines/{key}/stages/reorder: parameters: - name: key in: path required: true schema: type: string post: tags: - Pipelines operationId: reorderStages summary: Reorder stages (order = a permutation of every existing stage key) requestBody: required: true content: application/json: schema: type: object required: - order properties: order: type: array items: type: string responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' /pipelines/{key}/stages/{stage}: parameters: - name: key in: path required: true schema: type: string - name: stage in: path required: true schema: type: string patch: tags: - Pipelines operationId: updateStage summary: Rename/retype a stage. requestBody: required: true content: application/json: schema: type: object properties: key: type: string description: New key (slugified). label: type: string type: type: string enum: - open - won - lost responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' delete: tags: - Pipelines operationId: deleteStage summary: Delete a stage (fails if deals use it) responses: '200': description: Pipeline content: application/json: schema: $ref: '#/components/schemas/Pipeline' default: $ref: '#/components/responses/Problem' components: schemas: Pipeline: type: object properties: id: type: string example: pl_... object: type: string const: pipeline key: type: string name: type: string is_default: type: boolean stages: type: array items: type: object properties: id: type: string key: type: string label: type: string ordinal: type: integer type: type: string enum: - open - won - lost description: Semantic type; default open. Problem: type: object description: RFC-9457 error. Closed-set rejections carry valid_options + suggestion so an agent self-corrects. properties: type: type: string format: uri example: https://relmcrm.com/errors/unknown_value title: type: string status: type: integer detail: type: string code: type: string example: unknown_value field: type: string valid_options: type: array items: type: string suggestion: type: string request_id: type: string PipelineInput: type: object properties: key: type: string name: type: string is_default: type: boolean stages: type: array items: type: object properties: key: type: string description: Slugified on write (lowercase, [a-z0-9_]); original text kept as label. label: type: string type: type: string enum: - open - won - lost Deleted: type: object properties: id: type: string object: type: string deleted: type: boolean responses: Problem: description: RFC-9457 problem+json error. content: application/problem+json: schema: $ref: '#/components/schemas/Problem' securitySchemes: bearerAuth: type: http scheme: bearer description: Workspace-scoped API key. relm_live_... (live) or relm_test_... (free, isolated test mode). Mint at https://app.relmcrm.com/. oauth2: type: oauth2 description: 'OAuth 2.1 with PKCE (S256) and dynamic client registration (RFC 7591). Live mode only; test mode is API-key only. Discovery: /.well-known/oauth-authorization-server.' flows: authorizationCode: authorizationUrl: https://api.relmcrm.com/oauth/authorize tokenUrl: https://api.relmcrm.com/oauth/token refreshUrl: https://api.relmcrm.com/oauth/token scopes: crm: Read and write the connected Relm workspace