openapi: 3.0.3 info: title: Tropic API description: >- The Tropic public API enables organizations to connect Tropic with other software in their stack, creating a connected spend and procurement ecosystem. The API supports building custom integrations for tools that do not have pre-built connectors, including contract management, supplier management, procurement requests, and webhook configuration. version: 1.0.0 contact: name: Tropic Support url: https://help.tropicapp.io termsOfService: https://www.tropicapp.io/terms servers: - url: https://api.tropicapp.io/v1 description: Tropic Production API security: - BearerAuth: [] tags: - name: Contracts description: Manage vendor contracts and contract lifecycle - name: Suppliers description: Manage supplier profiles and relationships - name: Requests description: Manage procurement requests and approvals - name: Webhooks description: Configure and manage webhook subscriptions - name: Users description: Manage users and access paths: /contracts: get: summary: List Contracts description: Returns a paginated list of all contracts in the organization. operationId: listContracts tags: - Contracts parameters: - name: page in: query description: Page number for pagination schema: type: integer default: 1 - name: per_page in: query description: Number of results per page schema: type: integer default: 25 maximum: 100 - name: status in: query description: Filter by contract status schema: type: string enum: - active - expired - pending - cancelled - name: supplier_id in: query description: Filter by supplier ID schema: type: string responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Contract' meta: $ref: '#/components/schemas/PaginationMeta' '401': $ref: '#/components/responses/Unauthorized' post: summary: Create Contract description: Creates a new contract record. operationId: createContract tags: - Contracts requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContractCreate' responses: '201': description: Contract created content: application/json: schema: $ref: '#/components/schemas/Contract' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /contracts/{id}: get: summary: Get Contract description: Returns a single contract by ID. operationId: getContract tags: - Contracts parameters: - name: id in: path required: true schema: type: string description: Contract ID responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/Contract' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: summary: Update Contract description: Updates an existing contract. operationId: updateContract tags: - Contracts parameters: - name: id in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ContractUpdate' responses: '200': description: Contract updated content: application/json: schema: $ref: '#/components/schemas/Contract' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: summary: Delete Contract description: Deletes a contract record. operationId: deleteContract tags: - Contracts parameters: - name: id in: path required: true schema: type: string responses: '204': description: Contract deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /suppliers: get: summary: List Suppliers description: Returns a paginated list of all suppliers. operationId: listSuppliers tags: - Suppliers parameters: - name: page in: query schema: type: integer default: 1 - name: per_page in: query schema: type: integer default: 25 - name: q in: query description: Search query to filter suppliers by name schema: type: string responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Supplier' meta: $ref: '#/components/schemas/PaginationMeta' '401': $ref: '#/components/responses/Unauthorized' post: summary: Create Supplier description: Creates a new supplier profile. operationId: createSupplier tags: - Suppliers requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SupplierCreate' responses: '201': description: Supplier created content: application/json: schema: $ref: '#/components/schemas/Supplier' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /suppliers/{id}: get: summary: Get Supplier description: Returns a single supplier by ID. operationId: getSupplier tags: - Suppliers parameters: - name: id in: path required: true schema: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/Supplier' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' put: summary: Update Supplier description: Updates an existing supplier profile. operationId: updateSupplier tags: - Suppliers parameters: - name: id in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SupplierUpdate' responses: '200': description: Supplier updated content: application/json: schema: $ref: '#/components/schemas/Supplier' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /requests: get: summary: List Requests description: Returns a paginated list of procurement requests. operationId: listRequests tags: - Requests parameters: - name: page in: query schema: type: integer default: 1 - name: per_page in: query schema: type: integer default: 25 - name: status in: query description: Filter by request status schema: type: string enum: - draft - pending_approval - approved - rejected - cancelled responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ProcurementRequest' meta: $ref: '#/components/schemas/PaginationMeta' '401': $ref: '#/components/responses/Unauthorized' post: summary: Create Request description: Creates a new procurement request. operationId: createRequest tags: - Requests requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProcurementRequestCreate' responses: '201': description: Request created content: application/json: schema: $ref: '#/components/schemas/ProcurementRequest' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /requests/{id}: get: summary: Get Request description: Returns a single procurement request by ID. operationId: getRequest tags: - Requests parameters: - name: id in: path required: true schema: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ProcurementRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /requests/{id}/approve: post: summary: Approve Request description: Approves a pending procurement request. operationId: approveRequest tags: - Requests parameters: - name: id in: path required: true schema: type: string requestBody: content: application/json: schema: type: object properties: notes: type: string description: Approval notes responses: '200': description: Request approved content: application/json: schema: $ref: '#/components/schemas/ProcurementRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /requests/{id}/reject: post: summary: Reject Request description: Rejects a pending procurement request. operationId: rejectRequest tags: - Requests parameters: - name: id in: path required: true schema: type: string requestBody: content: application/json: schema: type: object properties: reason: type: string description: Rejection reason responses: '200': description: Request rejected content: application/json: schema: $ref: '#/components/schemas/ProcurementRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /webhooks: get: summary: List Webhooks description: Returns all configured webhook subscriptions. operationId: listWebhooks tags: - Webhooks responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' post: summary: Create Webhook description: Creates a new webhook subscription. operationId: createWebhook tags: - Webhooks requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookCreate' responses: '201': description: Webhook created content: application/json: schema: $ref: '#/components/schemas/Webhook' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' /webhooks/{id}: delete: summary: Delete Webhook description: Deletes a webhook subscription. operationId: deleteWebhook tags: - Webhooks parameters: - name: id in: path required: true schema: type: string responses: '204': description: Webhook deleted '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /users: get: summary: List Users description: Returns a list of users in the organization. operationId: listUsers tags: - Users parameters: - name: page in: query schema: type: integer default: 1 - name: per_page in: query schema: type: integer default: 25 responses: '200': description: Successful response content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/User' meta: $ref: '#/components/schemas/PaginationMeta' '401': $ref: '#/components/responses/Unauthorized' /users/{id}: get: summary: Get User description: Returns a single user by ID. operationId: getUser tags: - Users parameters: - name: id in: path required: true schema: type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/User' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' components: securitySchemes: BearerAuth: type: http scheme: bearer description: API key issued from the Tropic settings panel schemas: Contract: type: object properties: id: type: string description: Unique contract identifier name: type: string description: Contract name supplier_id: type: string description: Associated supplier ID supplier_name: type: string description: Supplier name status: type: string enum: - active - expired - pending - cancelled start_date: type: string format: date description: Contract start date end_date: type: string format: date description: Contract end date renewal_date: type: string format: date description: Contract renewal date total_value: type: number description: Total contract value in USD currency: type: string default: USD owner_id: type: string description: User ID of contract owner documents: type: array items: type: object properties: id: type: string name: type: string url: type: string created_at: type: string format: date-time updated_at: type: string format: date-time ContractCreate: type: object required: - name - supplier_id - start_date properties: name: type: string supplier_id: type: string start_date: type: string format: date end_date: type: string format: date renewal_date: type: string format: date total_value: type: number currency: type: string default: USD ContractUpdate: type: object properties: name: type: string status: type: string enum: - active - expired - pending - cancelled end_date: type: string format: date renewal_date: type: string format: date total_value: type: number Supplier: type: object properties: id: type: string description: Unique supplier identifier name: type: string description: Supplier company name website: type: string format: uri category: type: string description: Supplier category (e.g., Software, Services) status: type: string enum: - active - inactive - prospect contacts: type: array items: type: object properties: name: type: string email: type: string format: email role: type: string spend: type: number description: Total annual spend with this supplier in USD risk_rating: type: string enum: - low - medium - high created_at: type: string format: date-time updated_at: type: string format: date-time SupplierCreate: type: object required: - name properties: name: type: string website: type: string format: uri category: type: string SupplierUpdate: type: object properties: name: type: string website: type: string format: uri category: type: string status: type: string enum: - active - inactive - prospect ProcurementRequest: type: object properties: id: type: string description: Unique request identifier title: type: string description: Request title description: type: string requester_id: type: string description: User ID of requester supplier_id: type: string status: type: string enum: - draft - pending_approval - approved - rejected - cancelled amount: type: number description: Requested amount in USD currency: type: string default: USD category: type: string description: Spend category approver_id: type: string approved_at: type: string format: date-time rejected_at: type: string format: date-time rejection_reason: type: string created_at: type: string format: date-time updated_at: type: string format: date-time ProcurementRequestCreate: type: object required: - title - amount properties: title: type: string description: type: string supplier_id: type: string amount: type: number currency: type: string default: USD category: type: string Webhook: type: object properties: id: type: string url: type: string format: uri description: Webhook endpoint URL events: type: array items: type: string enum: - contract.created - contract.updated - contract.approved - contract.expired - request.created - request.approved - request.rejected - supplier.created - supplier.updated active: type: boolean default: true secret: type: string description: HMAC signing secret for payload verification created_at: type: string format: date-time WebhookCreate: type: object required: - url - events properties: url: type: string format: uri events: type: array items: type: string User: type: object properties: id: type: string name: type: string email: type: string format: email role: type: string enum: - admin - manager - user - viewer active: type: boolean created_at: type: string format: date-time PaginationMeta: type: object properties: total: type: integer page: type: integer per_page: type: integer total_pages: type: integer responses: Unauthorized: description: Unauthorized - invalid or missing API key content: application/json: schema: type: object properties: error: type: string BadRequest: description: Bad request - invalid parameters content: application/json: schema: type: object properties: error: type: string details: type: object NotFound: description: Resource not found content: application/json: schema: type: object properties: error: type: string