{"info":{"name":"Worbo API","description":"The Worbo API: contacts, objects and events, WhatsApp messages and templates, segments, automations, campaigns, the inbox, catalogs and webhooks.","version":"1.0.0","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{apiKey}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://api.worbo.app/v1"},{"key":"apiKey","value":"wk_test_…"}],"item":[{"name":"Workspace","description":"The key in use, the WhatsApp numbers, the usage of the month and the audit log.","item":[{"name":"List the audit log of the organization","request":{"method":"GET","description":"Needs the scope workspace:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/audit-logs","host":["{{baseUrl}}"],"path":["audit-logs"],"query":[{"key":"action","value":"","description":"Only the entries of this action.","disabled":true},{"key":"since","value":"","description":"Only what changed at or after this moment.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Read the key in use and its organization","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/me","host":["{{baseUrl}}"],"path":["me"]}}},{"name":"List the WhatsApp numbers, with quality, tier and warm-up","request":{"method":"GET","description":"Needs the scope workspace:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/numbers","host":["{{baseUrl}}"],"path":["numbers"]}}},{"name":"Read the usage of a month and the limits of the plan","request":{"method":"GET","description":"Needs the scope workspace:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/usage","host":["{{baseUrl}}"],"path":["usage"],"query":[{"key":"month","value":"","description":"The month, as YYYY-MM; the current month by default.","disabled":true}]}}}]},{"name":"Contacts","description":"People, found by any of their identities: phone, email, BSUID or the ID at a source.","item":[{"name":"List and search contacts","request":{"method":"GET","description":"Needs the scope contacts:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/contacts","host":["{{baseUrl}}"],"path":["contacts"],"query":[{"key":"search","value":"","description":"Text in the name, the phone or the email.","disabled":true},{"key":"phone","value":"","description":"The contact with this phone.","disabled":true},{"key":"email","value":"","description":"The contact with this email.","disabled":true},{"key":"external_id","value":"","description":"The contact with this ID at the source given in source.","disabled":true},{"key":"source","value":"","description":"The source of the external ID or of the contacts.","disabled":true},{"key":"tag","value":"","description":"Only the contacts with this tag.","disabled":true},{"key":"updated_since","value":"","description":"Only what changed at or after this moment.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Create or update a contact by any of its identities","request":{"method":"POST","description":"The contact is found by any of the identities sent; the others are attached to it. With update_existing_only, an unknown contact is not created. Needs the scope contacts:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts","host":["{{baseUrl}}"],"path":["contacts"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"identities\": {\n        \"phone\": \"+40722123456\",\n        \"email\": \"ana@example.com\",\n        \"external_id\": \"crm-1001\"\n    },\n    \"source\": \"crm\",\n    \"fields\": {\n        \"first_name\": \"Ana\"\n    },\n    \"update_existing_only\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"Create or update up to 100 contacts","request":{"method":"POST","description":"Needs the scope contacts:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/batch","host":["{{baseUrl}}"],"path":["contacts","batch"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"identities\": {\n                \"phone\": \"+40722123456\",\n                \"email\": \"ana@example.com\",\n                \"external_id\": \"crm-1001\"\n            },\n            \"source\": \"crm\",\n            \"fields\": {\n                \"first_name\": \"Ana\"\n            },\n            \"update_existing_only\": false\n        }\n    ]\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a contact","request":{"method":"GET","description":"Needs the scope contacts:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/contacts/:contact","host":["{{baseUrl}}"],"path":["contacts",":contact"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}]}}},{"name":"Change the fields and the tags of a contact","request":{"method":"PATCH","description":"Needs the scope contacts:write.","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/:contact","host":["{{baseUrl}}"],"path":["contacts",":contact"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"fields\": {\n        \"last_name\": \"Ionescu\"\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Erase a contact, at the request of the person (GDPR)","request":{"method":"DELETE","description":"The data of the contact is erased for good; the audit log keeps only that the erasure happened. Needs the scope contacts:delete.","url":{"raw":"{{baseUrl}}/contacts/:contact","host":["{{baseUrl}}"],"path":["contacts",":contact"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}},{"name":"Turn the keyword bot off or on for a contact","request":{"method":"POST","description":"For example when a CRM takes over the conversation. Needs the scope contacts:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/:contact/bot","host":["{{baseUrl}}"],"path":["contacts",":contact","bot"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"enabled\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"List the identities of a contact","request":{"method":"GET","description":"Needs the scope contacts:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/contacts/:contact/identities","host":["{{baseUrl}}"],"path":["contacts",":contact","identities"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}]}}},{"name":"Attach an identity to a contact","request":{"method":"POST","description":"Needs the scope contacts:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/:contact/identities","host":["{{baseUrl}}"],"path":["contacts",":contact","identities"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"type\": \"email\",\n    \"value\": \"ana@example.com\",\n    \"primary\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"Detach an identity from a contact","request":{"method":"DELETE","description":"Needs the scope contacts:write.","url":{"raw":"{{baseUrl}}/contacts/:contact/identities/:identity","host":["{{baseUrl}}"],"path":["contacts",":contact","identities",":identity"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."},{"key":"identity","value":"501","description":"The ID of the identity."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}},{"name":"Merge another contact into this one","request":{"method":"POST","description":"The identities, the history and the objects of the other contact move here; the event contact.merged follows. Needs the scope contacts:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/:contact/merge","host":["{{baseUrl}}"],"path":["contacts",":contact","merge"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 124\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Consent","description":"The append-only consent history, by purpose and topic, with the proof of each consent.","item":[{"name":"Read the consent of a contact, with its history","request":{"method":"GET","description":"Needs the scope contacts:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/contacts/:contact/consents","host":["{{baseUrl}}"],"path":["contacts",":contact","consents"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}]}}},{"name":"Record a consent, with its proof, or a withdrawal","request":{"method":"POST","description":"A consent withdrawn by the person can be given back only by the person: through a form, at checkout or through a link. Needs the scope consents:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/contacts/:contact/consents","host":["{{baseUrl}}"],"path":["contacts",":contact","consents"],"variable":[{"key":"contact","value":"123","description":"The ID of the contact."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"purposes\": [\n        \"channel\",\n        \"marketing\"\n    ],\n    \"state\": \"granted\",\n    \"source\": \"form\",\n    \"proof\": {\n        \"form\": \"Newsletter, footer\",\n        \"text\": \"I agree to receive offers on WhatsApp\"\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Create a signed link to the preference center of a contact","request":{"method":"POST","description":"The link is valid for 30 days. Needs the scope consents:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/preference-links","host":["{{baseUrl}}"],"path":["preference-links"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 123\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Data model","description":"The fields of the contacts, the object types and the event types of the organization, with their JSON Schema.","item":[{"name":"Read the JSON Schema of the body that writes a contact","request":{"method":"GET","description":"With the custom fields of the organization; any key reads it. Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/contacts/schema","host":["{{baseUrl}}"],"path":["contacts","schema"]}}},{"name":"List the event types","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/event-types","host":["{{baseUrl}}"],"path":["event-types"]}}},{"name":"Read an event type, with its properties","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/event-types/:type","host":["{{baseUrl}}"],"path":["event-types",":type"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}]}}},{"name":"Read the JSON Schema of the properties of an event type","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/event-types/:type/schema","host":["{{baseUrl}}"],"path":["event-types",":type","schema"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}]}}},{"name":"List the fields of the contacts","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/field-definitions","host":["{{baseUrl}}"],"path":["field-definitions"]}}},{"name":"Create a field of the contacts or of an object type","request":{"method":"POST","description":"Through the same checks and limits as in the dashboard; the key does not change afterwards. Needs the scope schema:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/field-definitions","host":["{{baseUrl}}"],"path":["field-definitions"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"object_type\": \"vehicle\",\n    \"labels\": {\n        \"en\": \"Plate\",\n        \"ro\": \"Număr de înmatriculare\"\n    },\n    \"key\": \"plate\",\n    \"type\": \"text\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"List the object types","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/object-types","host":["{{baseUrl}}"],"path":["object-types"]}}},{"name":"Create an object type","request":{"method":"POST","description":"The type belongs to the organization and counts against its limit of types. Needs the scope schema:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/object-types","host":["{{baseUrl}}"],"path":["object-types"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"labels\": {\n        \"en\": \"Vehicle\",\n        \"ro\": \"Vehicul\"\n    },\n    \"key\": \"vehicle\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read an object type, with its statuses, roles and fields","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/object-types/:type","host":["{{baseUrl}}"],"path":["object-types",":type"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}]}}},{"name":"Read the JSON Schema of the body that writes an object of the type","request":{"method":"GET","description":"Any key of the organization can call it.","url":{"raw":"{{baseUrl}}/object-types/:type/schema","host":["{{baseUrl}}"],"path":["object-types",":type","schema"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}]}}}]},{"name":"Objects","description":"Memberships, bookings, orders: the records of each object type, linked to contacts in roles.","item":[{"name":"List the objects of a type","request":{"method":"GET","description":"Needs the scope objects:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/objects/:type","host":["{{baseUrl}}"],"path":["objects",":type"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}],"query":[{"key":"external_id","value":"","description":"The object with this ID at the source.","disabled":true},{"key":"source","value":"","description":"Only the objects of this source.","disabled":true},{"key":"contact_id","value":"","description":"Only the objects linked to this contact.","disabled":true},{"key":"status","value":"","description":"The status on each axis, such as status[lifecycle]=active.","disabled":true},{"key":"updated_since","value":"","description":"Only what changed at or after this moment.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Create or update an object by its ID at the source","request":{"method":"POST","description":"Needs the scope objects:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/objects/:type","host":["{{baseUrl}}"],"path":["objects",":type"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"external_id\": \"abn-7781\",\n    \"source\": \"upfit\",\n    \"fields\": {\n        \"starts_on\": \"2026-09-01\",\n        \"ends_on\": \"2027-08-31\"\n    },\n    \"statuses\": {\n        \"lifecycle\": \"active\"\n    },\n    \"contact\": {\n        \"identities\": {\n            \"phone\": \"+40722123456\"\n        }\n    },\n    \"role\": \"holder\",\n    \"update_existing_only\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"Create or update up to 100 objects","request":{"method":"POST","description":"Needs the scope objects:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/objects/:type/batch","host":["{{baseUrl}}"],"path":["objects",":type","batch"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"external_id\": \"abn-7781\",\n            \"source\": \"upfit\",\n            \"fields\": {\n                \"starts_on\": \"2026-09-01\",\n                \"ends_on\": \"2027-08-31\"\n            },\n            \"statuses\": {\n                \"lifecycle\": \"active\"\n            },\n            \"contact\": {\n                \"identities\": {\n                    \"phone\": \"+40722123456\"\n                }\n            },\n            \"role\": \"holder\",\n            \"update_existing_only\": false\n        }\n    ]\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read an object","request":{"method":"GET","description":"Needs the scope objects:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/objects/:type/:object","host":["{{baseUrl}}"],"path":["objects",":type",":object"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."},{"key":"object","value":"456","description":"The ID of the object."}]}}},{"name":"Change the fields or the statuses of an object","request":{"method":"PATCH","description":"Needs the scope objects:write.","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/objects/:type/:object","host":["{{baseUrl}}"],"path":["objects",":type",":object"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."},{"key":"object","value":"456","description":"The ID of the object."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"statuses\": {\n        \"lifecycle\": \"frozen\"\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Link a contact to an object, in a role","request":{"method":"POST","description":"Needs the scope objects:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/objects/:type/:object/relations","host":["{{baseUrl}}"],"path":["objects",":type",":object","relations"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."},{"key":"object","value":"456","description":"The ID of the object."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 123,\n    \"role\": \"beneficiary\",\n    \"primary\": false,\n    \"muted\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"Remove the link of a contact to an object","request":{"method":"DELETE","description":"Needs the scope objects:write.","url":{"raw":"{{baseUrl}}/objects/:type/:object/relations/:relation","host":["{{baseUrl}}"],"path":["objects",":type",":object","relations",":relation"],"variable":[{"key":"type","value":"fit.membership","description":"The key of the type, such as fit.membership."},{"key":"object","value":"456","description":"The ID of the object."},{"key":"relation","value":"77","description":"The ID of the relation."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Files","description":"The files of the file fields: uploaded first, then given by ID as the value of the field.","item":[{"name":"Upload a file for a file field","request":{"method":"POST","description":"PDF, images, Office, text or CSV documents, up to 16 MB. A file not used by any field within a day is deleted. Needs the scope files:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/files","host":["{{baseUrl}}"],"path":["files"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"formdata","formdata":[{"key":"file","type":"file","src":[]}]}}},{"name":"Read a file, with the contact or the object that uses it","request":{"method":"GET","description":"Needs the scope files:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/files/:file","host":["{{baseUrl}}"],"path":["files",":file"],"variable":[{"key":"file","value":"77","description":"The ID of the file."}]}}},{"name":"Download the content of a file","request":{"method":"GET","description":"Needs the scope files:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/files/:file/content","host":["{{baseUrl}}"],"path":["files",":file","content"],"variable":[{"key":"file","value":"77","description":"The ID of the file."}]}}}]},{"name":"Events","description":"What happened at the source; events start automations and update objects.","item":[{"name":"Record an event","request":{"method":"POST","description":"The contact and the object of the event are found or created; an event with the same ID from the same source is recorded only once. Needs the scope events:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/events","host":["{{baseUrl}}"],"path":["events"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"id\": \"m-1\",\n    \"type\": \"membership.created\",\n    \"occurred_at\": \"2026-10-15T09:00:00+03:00\",\n    \"source\": \"upfit\",\n    \"contact\": {\n        \"phone\": \"+40722123456\"\n    },\n    \"object\": {\n        \"type\": \"fit.membership\",\n        \"external_id\": \"abn-7781\",\n        \"upsert\": {\n            \"statuses\": {\n                \"lifecycle\": \"active\"\n            }\n        }\n    },\n    \"properties\": {\n        \"plan\": \"plan-12\"\n    },\n    \"historical\": false,\n    \"update_existing_only\": false\n}","options":{"raw":{"language":"json"}}}}},{"name":"Record up to 100 events","request":{"method":"POST","description":"Needs the scope events:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/events/batch","host":["{{baseUrl}}"],"path":["events","batch"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"id\": \"m-1\",\n            \"type\": \"membership.created\",\n            \"occurred_at\": \"2026-10-15T09:00:00+03:00\",\n            \"source\": \"upfit\",\n            \"contact\": {\n                \"phone\": \"+40722123456\"\n            },\n            \"object\": {\n                \"type\": \"fit.membership\",\n                \"external_id\": \"abn-7781\",\n                \"upsert\": {\n                    \"statuses\": {\n                        \"lifecycle\": \"active\"\n                    }\n                }\n            },\n            \"properties\": {\n                \"plan\": \"plan-12\"\n            },\n            \"historical\": false,\n            \"update_existing_only\": false\n        }\n    ]\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Messages","description":"WhatsApp messages sent and received, through the same rules as in the dashboard.","item":[{"name":"List the messages","request":{"method":"GET","description":"Needs the scope messages:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/messages","host":["{{baseUrl}}"],"path":["messages"],"query":[{"key":"contact_id","value":"","description":"Only the messages of this contact.","disabled":true},{"key":"direction","value":"","description":"Received or sent.","disabled":true},{"key":"status","value":"","description":"Only the messages with this status.","disabled":true},{"key":"since","value":"","description":"Only what changed at or after this moment.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Send a template, a free text or a form to a contact","request":{"method":"POST","description":"The message goes through the same rules as in the dashboard: consent, quiet hours, frequency and limits. A free text or a form needs the 24-hour window open; a refusal comes with the code of the reason, such as window_closed. The answers to a form come with the webhook flow.submitted. Needs the scope messages:send.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/messages","host":["{{baseUrl}}"],"path":["messages"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 123,\n    \"template\": {\n        \"name\": \"booking_confirmed\",\n        \"language\": \"ro\",\n        \"variables\": [\n            \"Ana\",\n            \"3 octombrie, 18:00\"\n        ]\n    },\n    \"flow\": {\n        \"key\": \"nps\",\n        \"body\": \"Ne spui în 10 secunde cum a fost?\"\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a message and its status","request":{"method":"GET","description":"Needs the scope messages:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/messages/:message","host":["{{baseUrl}}"],"path":["messages",":message"],"variable":[{"key":"message","value":"7001","description":"The ID of the message."}]}}},{"name":"Read the proof of a message sent with a durable medium candidate template","request":{"method":"GET","description":"The exact text the contact got and the document of the header kept by Worbo, with their SHA-256 fingerprints, and the moments Meta reported. It does not replace the email required by law. Needs the scope messages:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/messages/:message/evidence","host":["{{baseUrl}}"],"path":["messages",":message","evidence"],"variable":[{"key":"message","value":"7001","description":"The ID of the message."}]}}},{"name":"Download the document kept as the proof of a message","request":{"method":"GET","description":"Needs the scope messages:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/messages/:message/evidence/document","host":["{{baseUrl}}"],"path":["messages",":message","evidence","document"],"variable":[{"key":"message","value":"7001","description":"The ID of the message."}]}}}]},{"name":"Document vault","description":"Files given to a contact through a link that expires, announced on WhatsApp and opened only with a code sent to the phone of the contact.","item":[{"name":"Give a file to a contact through the vault","request":{"method":"POST","description":"Upload the file first with uploadFile. The contact gets the template worbo_document on WhatsApp, with the title, the term and the button that opens the link; the link opens only with a code sent to their phone. The answer has the link, the only time it is shown: send it by email too, if needed. The number needs the templates of the vault approved, made on the page of the vault. Needs the scope vault:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/vault","host":["{{baseUrl}}"],"path":["vault"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 123,\n    \"file_id\": 77,\n    \"title\": \"Rezultatul analizelor\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a document of the vault, with the state of its link and the openings","request":{"method":"GET","description":"Needs the scope vault:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/vault/:vault","host":["{{baseUrl}}"],"path":["vault",":vault"],"variable":[{"key":"vault","value":"15","description":"The ID of the document in the vault."}]}}},{"name":"Revoke the link of a document of the vault","request":{"method":"DELETE","description":"Needs the scope vault:write.","url":{"raw":"{{baseUrl}}/vault/:vault","host":["{{baseUrl}}"],"path":["vault",":vault"],"variable":[{"key":"vault","value":"15","description":"The ID of the document in the vault."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Verification codes","description":"One-time codes sent on WhatsApp with the authentication template of the number, checked by Worbo or by the organization.","item":[{"name":"Send a verification code on WhatsApp","request":{"method":"POST","description":"Without code, Worbo makes a 6-digit code, valid for 10 minutes, and checks it with verifyOtp; with code, the organization checks it itself. The message leaves at once, with the authentication template of the number, approved on its page. A phone known to have no WhatsApp gets otp_undeliverable at once, so the site can offer SMS or email; otherwise a failure comes as the status of the message and the webhook message.failed. A phone gets at most 5 codes in 15 minutes and one every 30 seconds (otp_rate_limited, otp_too_soon). The code never appears in answers, webhooks or the inbox. Needs the scope otp:send.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/otp","host":["{{baseUrl}}"],"path":["otp"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"phone\": \"+40722123456\",\n    \"code\": \"482913\",\n    \"language\": \"ro\",\n    \"purpose\": \"login\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"Check a verification code made by Worbo","request":{"method":"POST","description":"A code is used once, within its term, with at most 5 attempts; the answer says why a check failed. A code given by the organization gets 409 otp_not_verifiable. Needs the scope otp:verify.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/otp/:otp/verify","host":["{{baseUrl}}"],"path":["otp",":otp","verify"],"variable":[{"key":"otp","value":"880","description":"The ID of the verification code, from the answer that sent it."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"code\": \"482913\"\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Recommendations","description":"The rules of the recommendation engine and what one of them would recommend now to a contact, with the reason of each item.","item":[{"name":"List the recommendation rules","request":{"method":"GET","description":"The active rules, made in the dashboard at Recommendations: the catalog, the types in their order, the number of items and the cooldowns. The automations use them by key. Needs the scope recommendations:read.","url":{"raw":"{{baseUrl}}/recommendation-rules","host":["{{baseUrl}}"],"path":["recommendation-rules"]}}},{"name":"Read the results of a recommendation rule","request":{"method":"GET","description":"On a period, by default the last 30 days: the recommendations sent and their recipients, the steps skipped by reason, the clicks on the items, the conversions within 7 days of the message (an order for the products, a booking for the classes, a membership for the plans), the revenue per recipient, the control group of the automations, the opt-outs after the message and the cost at Meta per conversion. Needs the scope recommendations:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/recommendation-rules/:rule/results","host":["{{baseUrl}}"],"path":["recommendation-rules",":rule","results"],"variable":[{"key":"rule","value":"ecom.cross_sell","description":"The key of the recommendation rule."}]}}},{"name":"Preview a recommendation rule on a contact","request":{"method":"POST","description":"What the rule would recommend now to the contact, with the reason of each item, the items left out and why, the cooldown of the rule and the consent needed. Nothing is sent and the cooldowns stay as they are. The recommendations from the history of the contact need the purpose recommendations besides marketing. Needs the scope recommendations:read. Reads data, so it needs a live key.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/recommendations/preview","host":["{{baseUrl}}"],"path":["recommendations","preview"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"rule\": \"ecom.cross_sell\",\n    \"contact_id\": 123\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Templates","description":"WhatsApp templates: drafts checked by the linter, submission to Meta and status.","item":[{"name":"List the templates","request":{"method":"GET","description":"Needs the scope templates:read.","url":{"raw":"{{baseUrl}}/templates","host":["{{baseUrl}}"],"path":["templates"],"query":[{"key":"number_id","value":"","description":"Only the templates of this number.","disabled":true},{"key":"status","value":"","description":"Only the templates with this status.","disabled":true},{"key":"name","value":"","description":"Only the templates with this name.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Draft a template, checked by the linter","request":{"method":"POST","description":"Needs the scope templates:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/templates","host":["{{baseUrl}}"],"path":["templates"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"name\": \"booking_confirmed\",\n    \"language\": \"ro\",\n    \"category\": \"utility\",\n    \"body\": \"Bună, {{1}}. Rezervarea ta pentru {{2}} este confirmată.\",\n    \"examples\": [\n        \"Ana\",\n        \"3 octombrie, 18:00\"\n    ],\n    \"fields\": [\n        \"contact.first_name\",\n        null\n    ]\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a template","request":{"method":"GET","description":"Needs the scope templates:read.","url":{"raw":"{{baseUrl}}/templates/:template","host":["{{baseUrl}}"],"path":["templates",":template"],"variable":[{"key":"template","value":"31","description":"The ID of the template."}]}}},{"name":"Submit a template to Meta","request":{"method":"POST","description":"Stopped by the linter, with the reason, or accepted, with the status in review. Needs the scope templates:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/templates/:template/submit","host":["{{baseUrl}}"],"path":["templates",":template","submit"],"variable":[{"key":"template","value":"31","description":"The ID of the template."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Offers","description":"Offers found by their code and redeemed, at the front desk or in the software of the source.","item":[{"name":"Find an offer by its code","request":{"method":"GET","description":"Needs the scope objects:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/offers/:code","host":["{{baseUrl}}"],"path":["offers",":code"],"variable":[{"key":"code","value":"AUTUMN-7KQ2","description":"The code of the offer."}]}}},{"name":"Mark an offer as used","request":{"method":"POST","description":"Needs the scope objects:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/offers/:code/redeem","host":["{{baseUrl}}"],"path":["offers",":code","redeem"],"variable":[{"key":"code","value":"AUTUMN-7KQ2","description":"The code of the offer."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}}}}]},{"name":"Segments","description":"Dynamic segments of contacts, counted live.","item":[{"name":"List the segments","request":{"method":"GET","description":"Needs the scope segments:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/segments","host":["{{baseUrl}}"],"path":["segments"],"query":[{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Create a segment","request":{"method":"POST","description":"Needs the scope segments:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/segments","host":["{{baseUrl}}"],"path":["segments"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"name\": \"Toți membrii\",\n    \"definition\": {\n        \"match\": \"all\",\n        \"conditions\": [\n            {\n                \"type\": \"field\",\n                \"field\": \"first_name\",\n                \"operator\": \"not_empty\"\n            }\n        ]\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Count the contacts of a definition, without saving it","request":{"method":"POST","description":"Needs the scope segments:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/segments/count","host":["{{baseUrl}}"],"path":["segments","count"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"definition\": {\n        \"match\": \"all\",\n        \"conditions\": [\n            {\n                \"type\": \"field\",\n                \"field\": \"first_name\",\n                \"operator\": \"not_empty\"\n            }\n        ]\n    }\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a segment, with its live count","request":{"method":"GET","description":"Needs the scope segments:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/segments/:segment","host":["{{baseUrl}}"],"path":["segments",":segment"],"variable":[{"key":"segment","value":"12","description":"The ID of the segment."}]}}}]},{"name":"Automations","description":"Reading automations, starting one for a contact and taking a contact out of a run.","item":[{"name":"List the automations","request":{"method":"GET","description":"Needs the scope automations:read.","url":{"raw":"{{baseUrl}}/automations","host":["{{baseUrl}}"],"path":["automations"],"query":[{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Read an automation, with its definition and its figures","request":{"method":"GET","description":"Needs the scope automations:read.","url":{"raw":"{{baseUrl}}/automations/:automation","host":["{{baseUrl}}"],"path":["automations",":automation"],"variable":[{"key":"automation","value":"8","description":"The ID of the automation."}]}}},{"name":"Start an automation for a contact","request":{"method":"POST","description":"Only an active automation started by hand. The run takes the newest object of the contact of the type chosen in the trigger; the same Idempotency-Key starts it only once. Needs the scope automations:run.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/automations/:automation/runs","host":["{{baseUrl}}"],"path":["automations",":automation","runs"],"variable":[{"key":"automation","value":"8","description":"The ID of the automation."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"contact_id\": 123\n}","options":{"raw":{"language":"json"}}}}},{"name":"Take a contact out of a run","request":{"method":"DELETE","description":"Needs the scope automations:run.","url":{"raw":"{{baseUrl}}/automations/:automation/runs/:run","host":["{{baseUrl}}"],"path":["automations",":automation","runs",":run"],"variable":[{"key":"automation","value":"8","description":"The ID of the automation."},{"key":"run","value":"3301","description":"The ID of the run."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Campaigns","description":"Campaign drafts and their estimate; the launch is approved in the dashboard.","item":[{"name":"List the campaigns","request":{"method":"GET","description":"Needs the scope campaigns:read.","url":{"raw":"{{baseUrl}}/campaigns","host":["{{baseUrl}}"],"path":["campaigns"],"query":[{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Create a campaign draft","request":{"method":"POST","description":"The moments come in ISO 8601, with their time zone. The launch is approved in the dashboard. Needs the scope campaigns:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/campaigns","host":["{{baseUrl}}"],"path":["campaigns"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"name\": \"Oferta de toamnă\",\n    \"object_id\": 456,\n    \"object_roles\": [\n        \"holder\"\n    ],\n    \"number_id\": 3,\n    \"template\": \"autumn_offer\",\n    \"segment_id\": 12,\n    \"scheduled_at\": \"2026-10-20T10:00:00+03:00\",\n    \"wave_by\": \"size\",\n    \"wave_hours\": 24\n}","options":{"raw":{"language":"json"}}}}},{"name":"Read a campaign, with the report of its messages and the cost","request":{"method":"GET","description":"Needs the scope campaigns:read.","url":{"raw":"{{baseUrl}}/campaigns/:campaign","host":["{{baseUrl}}"],"path":["campaigns",":campaign"],"variable":[{"key":"campaign","value":"21","description":"The ID of the campaign."}]}}},{"name":"Estimate the audience and the cost of a campaign","request":{"method":"POST","description":"With the same exclusions as at launch: no WhatsApp, no consent, undeliverable, the frequency cap. Needs the scope campaigns:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/campaigns/:campaign/estimate","host":["{{baseUrl}}"],"path":["campaigns",":campaign","estimate"],"variable":[{"key":"campaign","value":"21","description":"The ID of the campaign."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Conversations","description":"The inbox: conversations, their messages, replies, assignment and closing.","item":[{"name":"List the conversations","request":{"method":"GET","description":"Needs the scope conversations:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/conversations","host":["{{baseUrl}}"],"path":["conversations"],"query":[{"key":"status","value":"","description":"Only the conversations with this status.","disabled":true},{"key":"contact_id","value":"","description":"Only the conversations of this contact.","disabled":true},{"key":"assigned_user_id","value":"","description":"Only the conversations assigned to this member.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Assign a conversation to a member","request":{"method":"POST","description":"Needs the scope conversations:reply.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/conversations/:conversation/assign","host":["{{baseUrl}}"],"path":["conversations",":conversation","assign"],"variable":[{"key":"conversation","value":"640","description":"The ID of the conversation."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"user_id\": 5\n}","options":{"raw":{"language":"json"}}}}},{"name":"Close a conversation","request":{"method":"POST","description":"Needs the scope conversations:reply.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/conversations/:conversation/close","host":["{{baseUrl}}"],"path":["conversations",":conversation","close"],"variable":[{"key":"conversation","value":"640","description":"The ID of the conversation."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}},{"name":"List the messages of a conversation","request":{"method":"GET","description":"Needs the scope conversations:read. Reads data, so it needs a live key.","url":{"raw":"{{baseUrl}}/conversations/:conversation/messages","host":["{{baseUrl}}"],"path":["conversations",":conversation","messages"],"variable":[{"key":"conversation","value":"640","description":"The ID of the conversation."}],"query":[{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Reply with a free text, in the 24-hour window","request":{"method":"POST","description":"Needs the scope conversations:reply.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/conversations/:conversation/messages","host":["{{baseUrl}}"],"path":["conversations",":conversation","messages"],"variable":[{"key":"conversation","value":"640","description":"The ID of the conversation."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"text\": \"Bună! Cu ce vă ajutăm?\"\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Catalogs","description":"Products, services, classes, plans and locations, written one by one or in batches.","item":[{"name":"List the catalogs","request":{"method":"GET","description":"Needs the scope catalogs:read.","url":{"raw":"{{baseUrl}}/catalogs","host":["{{baseUrl}}"],"path":["catalogs"]}}},{"name":"List the items of a catalog","request":{"method":"GET","description":"Needs the scope catalogs:read.","url":{"raw":"{{baseUrl}}/catalogs/:catalog/items","host":["{{baseUrl}}"],"path":["catalogs",":catalog","items"],"variable":[{"key":"catalog","value":"fit.classes","description":"The key of the catalog, such as fit.classes."}],"query":[{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Create or update an item by its ID at the source","request":{"method":"POST","description":"Needs the scope catalogs:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/catalogs/:catalog/items","host":["{{baseUrl}}"],"path":["catalogs",":catalog","items"],"variable":[{"key":"catalog","value":"fit.classes","description":"The key of the catalog, such as fit.classes."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"external_id\": \"yoga\",\n    \"name\": \"Yoga\",\n    \"price\": 50,\n    \"currency\": \"RON\",\n    \"available\": true,\n    \"recommendable\": true\n}","options":{"raw":{"language":"json"}}}}},{"name":"Create or update up to 100 items","request":{"method":"POST","description":"Needs the scope catalogs:write.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/catalogs/:catalog/items/batch","host":["{{baseUrl}}"],"path":["catalogs",":catalog","items","batch"],"variable":[{"key":"catalog","value":"fit.classes","description":"The key of the catalog, such as fit.classes."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"items\": [\n        {\n            \"external_id\": \"yoga\",\n            \"name\": \"Yoga\",\n            \"price\": 50,\n            \"currency\": \"RON\",\n            \"available\": true,\n            \"recommendable\": true\n        }\n    ]\n}","options":{"raw":{"language":"json"}}}}}]},{"name":"Webhooks","description":"The endpoints that receive the events of Worbo, their deliveries and replays.","item":[{"name":"List the deliveries of the events","request":{"method":"GET","description":"Needs the scope webhooks:manage.","url":{"raw":"{{baseUrl}}/webhook-deliveries","host":["{{baseUrl}}"],"path":["webhook-deliveries"],"query":[{"key":"endpoint_id","value":"","description":"Only the deliveries to this endpoint.","disabled":true},{"key":"status","value":"","description":"Only the deliveries with this status.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Send a delivery again","request":{"method":"POST","description":"Needs the scope webhooks:manage.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/webhook-deliveries/:delivery/replay","host":["{{baseUrl}}"],"path":["webhook-deliveries",":delivery","replay"],"variable":[{"key":"delivery","value":"9001","description":"The ID of the delivery."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}},{"name":"List the webhook endpoints","request":{"method":"GET","description":"Needs the scope webhooks:manage.","url":{"raw":"{{baseUrl}}/webhook-endpoints","host":["{{baseUrl}}"],"path":["webhook-endpoints"]}}},{"name":"Add a webhook endpoint","request":{"method":"POST","description":"The signing secret is in the response, only now. Needs the scope webhooks:manage.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/webhook-endpoints","host":["{{baseUrl}}"],"path":["webhook-endpoints"],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"url\": \"https://crm.example.com/worbo\",\n    \"events\": [\n        \"contact.created\",\n        \"message.received\"\n    ],\n    \"payload\": \"snapshot\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"Change the address or the events of an endpoint","request":{"method":"PATCH","description":"Needs the scope webhooks:manage.","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/webhook-endpoints/:endpoint","host":["{{baseUrl}}"],"path":["webhook-endpoints",":endpoint"],"variable":[{"key":"endpoint","value":"4","description":"The ID of the webhook endpoint."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]},"body":{"mode":"raw","raw":"{\n    \"url\": \"https://crm.example.com/worbo\",\n    \"events\": [\n        \"contact.created\",\n        \"message.received\"\n    ],\n    \"payload\": \"snapshot\"\n}","options":{"raw":{"language":"json"}}}}},{"name":"Delete a webhook endpoint","request":{"method":"DELETE","description":"Needs the scope webhooks:manage.","url":{"raw":"{{baseUrl}}/webhook-endpoints/:endpoint","host":["{{baseUrl}}"],"path":["webhook-endpoints",":endpoint"],"variable":[{"key":"endpoint","value":"4","description":"The ID of the webhook endpoint."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}},{"name":"Rotate the signing secret of an endpoint","request":{"method":"POST","description":"The previous secret stays valid for 24 hours; meanwhile, both signatures are sent. Needs the scope webhooks:manage.","header":[{"key":"Idempotency-Key","value":"{{$guid}}"}],"url":{"raw":"{{baseUrl}}/webhook-endpoints/:endpoint/rotate","host":["{{baseUrl}}"],"path":["webhook-endpoints",":endpoint","rotate"],"variable":[{"key":"endpoint","value":"4","description":"The ID of the webhook endpoint."}],"query":[{"key":"dry_run","value":"","description":"Runs every check and returns what would happen, without saving anything.","disabled":true}]}}}]},{"name":"Reports","description":"The results of a period and the conversions of the automations.","item":[{"name":"List the conversions of the automations","request":{"method":"GET","description":"Needs the scope analytics:read.","url":{"raw":"{{baseUrl}}/conversions","host":["{{baseUrl}}"],"path":["conversions"],"query":[{"key":"automation_id","value":"","description":"Only the conversions of this automation.","disabled":true},{"key":"since","value":"","description":"Only what changed at or after this moment.","disabled":true},{"key":"limit","value":"","description":"How many items a page has, between 1 and 100.","disabled":true},{"key":"cursor","value":"","description":"The next_cursor of the previous page.","disabled":true}]}}},{"name":"Read the results of a period","request":{"method":"GET","description":"The automations with the control group, the baseline, the value and the cost, in the days of the organization. Needs the scope analytics:read.","url":{"raw":"{{baseUrl}}/reports/results","host":["{{baseUrl}}"],"path":["reports","results"],"query":[{"key":"from","value":"","description":"The first day of the period.","disabled":true},{"key":"to","value":"","description":"The last day of the period.","disabled":true},{"key":"location_id","value":"","description":"Only the contacts of this home location.","disabled":true}]}}}]}]}