Download OpenAPI specification:
Describes the webhook events exchanged between topi SaaS and external partners (e.g. PEAC).
Outgoing events are fired by topi SaaS and delivered to partner webhook endpoints.
Incoming events are fired by partners and delivered to topi SaaS webhook endpoints.
Every event shares a common envelope; the payload field varies by event type.
Fired when an end-user accepts an offer inside the topi SaaS journey. Partners should use this event to initiate their downstream contract creation process.
| type required | string Value: "topi_saas.offer.accepted_by_user" Event type in the format |
| version required | integer Schema version of this event type. Incremented only on breaking changes. Additive (non-breaking) changes do not increment the version. |
| event_id required | string <uuid> Unique ID of this event instance. Consumers should use this as an
idempotency key — if the same |
| created_at required | string <date-time> ISO 8601 timestamp of when the event was created. |
| object_id required | string <uuid> ID of the primary object this event relates to. For offer events this is the offer ID. |
required | object (OfferAcceptedByUserPayload) |
{- "type": "topi_saas.offer.accepted_by_user",
- "version": 1,
- "event_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
- "created_at": "2026-05-19T10:30:00Z",
- "object_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "payload": {
- "offer_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "seller": {
- "seller_id": "f6a7b8c9-d0e1-2345-fabc-456789012345",
- "seller_name": "Acme Tech GmbH",
- "external_id": "PEAC_VENDOR_001"
}, - "offer": {
- "offer_lines": [
- {
- "offer_line_id": "a7b8c9d0-e1f2-3456-abcd-567890123456",
- "title": "Apple MacBook Pro 16\" M3 Pro",
- "quantity": 2,
- "product_price": {
- "value": 249900,
- "currency": "EUR"
}, - "price": {
- "value": 499800,
- "currency": "EUR"
}, - "product_category": "laptops"
}
], - "total_price": {
- "value": 499800,
- "currency": "EUR"
}
}, - "end_customer": {
- "end_customer_id": "b8c9d0e1-f2a3-4567-bcde-678901234567",
- "external_id": "PEAC_CUST_9876",
- "company_name": "Widgets & Co. GmbH",
- "vat_number": "DE123456789",
- "tax_number": null,
- "registration_number": "HRB 123456",
- "returning_customer": false,
- "address": {
- "line_1": "Musterstraße 42",
- "line_2": null,
- "city": "Hamburg",
- "postal_code": "20095",
- "country_code": "DE"
}
}, - "user": {
- "user_id": "c9d0e1f2-a3b4-5678-cdef-789012345678",
- "external_id": "PEAC_USER_5432",
- "email": "max.muster@widgets-co.de",
- "first_name": "Max",
- "last_name": "Muster",
- "phone_number": "+49 40 12345678"
}, - "shipping_address": {
- "recipient_name": "Widgets & Co. GmbH",
- "line_1": "Lagerstraße 7",
- "line_2": "Gebäude B",
- "city": "Hamburg",
- "postal_code": "20097",
- "country_code": "DE"
}
}
}Sent by the partner to confirm that they have accepted the offer on their side, enriching it with partner-assigned external IDs.
| type required | string Value: "topi_saas.offer.accepted" Event type in the format |
| version required | integer Schema version of this event type. Incremented only on breaking changes. Additive (non-breaking) changes do not increment the version. |
| event_id required | string <uuid> Unique ID of this event instance. Consumers should use this as an
idempotency key — if the same |
| created_at required | string <date-time> ISO 8601 timestamp of when the event was created. |
| object_id required | string <uuid> ID of the primary object this event relates to. For offer events this is the offer ID. |
required | object (OfferAcceptedPayload) |
{- "type": "topi_saas.offer.accepted",
- "version": 1,
- "event_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
- "created_at": "2026-05-19T11:00:00Z",
- "object_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "payload": {
- "offer_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "offer": {
- "offer_lines": [
- {
- "external_id": "PEAC_LINE_001"
}
]
}, - "end_customer": {
- "end_customer_id": "b8c9d0e1-f2a3-4567-bcde-678901234567",
- "external_id": "PEAC_CUST_9876",
- "company_name": "Widgets & Co. GmbH",
- "vat_number": "DE123456789",
- "returning_customer": false,
- "address": {
- "line_1": "Musterstraße 42",
- "city": "Hamburg",
- "postal_code": "20095",
- "country_code": "DE"
}
}, - "user": {
- "user_id": "c9d0e1f2-a3b4-5678-cdef-789012345678",
- "external_id": "PEAC_USER_5432",
- "email": "max.muster@widgets-co.de",
- "first_name": "Max",
- "last_name": "Muster",
- "phone_number": "+49 40 12345678"
}
}
}Sent by the partner to notify topi SaaS that an offer has been declined on their side.
| type required | string Value: "topi_saas.offer.declined" Event type in the format |
| version required | integer Schema version of this event type. Incremented only on breaking changes. Additive (non-breaking) changes do not increment the version. |
| event_id required | string <uuid> Unique ID of this event instance. Consumers should use this as an
idempotency key — if the same |
| created_at required | string <date-time> ISO 8601 timestamp of when the event was created. |
| object_id required | string <uuid> ID of the primary object this event relates to. For offer events this is the offer ID. |
required | object (OfferDeclinedPayload) |
{- "type": "topi_saas.offer.declined",
- "version": 1,
- "event_id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
- "created_at": "2026-05-19T11:30:00Z",
- "object_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "payload": {
- "offer_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "end_customer": {
- "end_customer_id": "b8c9d0e1-f2a3-4567-bcde-678901234567",
- "external_id": "PEAC_CUST_9876"
}, - "reason": "credit_check_failed"
}
}Sent by the partner to notify topi SaaS that the contract has started and the physical assets are being shipped to the end customer.
| type required | string Value: "topi_saas.offer.contract_started" Event type in the format |
| version required | integer Schema version of this event type. Incremented only on breaking changes. Additive (non-breaking) changes do not increment the version. |
| event_id required | string <uuid> Unique ID of this event instance. Consumers should use this as an
idempotency key — if the same |
| created_at required | string <date-time> ISO 8601 timestamp of when the event was created. |
| object_id required | string <uuid> ID of the primary object this event relates to. For offer events this is the offer ID. |
required | object (OfferContractStartedPayload) |
{- "type": "topi_saas.offer.contract_started",
- "version": 1,
- "event_id": "d4e5f6a7-b8c9-0123-defa-234567890123",
- "created_at": "2026-05-19T14:00:00Z",
- "object_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "payload": {
- "offer_id": "e5f6a7b8-c9d0-1234-efab-345678901234",
- "assets": [
- {
- "offer_line_id": "a7b8c9d0-e1f2-3456-abcd-567890123456",
- "external_id": "PEAC_LINE_001",
- "serial_number": "C02ZK1ZYMD6T",
- "title": "Apple MacBook Pro 16\" M3 Pro"
}
], - "shipping_address": {
- "recipient_name": "Widgets & Co. GmbH",
- "line_1": "Lagerstraße 7",
- "line_2": "Gebäude B",
- "city": "Hamburg",
- "postal_code": "20097",
- "country_code": "DE"
}
}
}