### Getting Started with Systeme.io Webhooks Source: https://developer.systeme.io/docs/webhooks Provides a two-step guide for integrating systeme.io webhooks. It covers preparing a public URL to receive POST requests and creating a webhook subscription within the systeme.io account. -------------------------------- ### Shell Command Example Source: https://developer.systeme.io/reference/post_contact_tag A basic example of a shell command returning a JSON success status. ```Shell 1{"success":true} ``` -------------------------------- ### Shell Command Example Source: https://developer.systeme.io/reference/api_tags_post A basic example of a shell command returning a JSON success status. ```Shell 1{"success":true} ``` -------------------------------- ### Shell Command Example Source: https://developer.systeme.io/reference/post_contact A basic example of a shell command returning a JSON success status. ```Shell 1{"success":true} ``` -------------------------------- ### Shell Command Example Source: https://developer.systeme.io/recipes A basic example of a shell command, often used for scripting or interacting with the system. This snippet demonstrates a simple output. ```shell echo 'Hello, Systeme.io!' ``` -------------------------------- ### Systeme.io Webhook Troubleshooting Guide Source: https://developer.systeme.io/docs/webhooks This section outlines common issues encountered when using systeme.io webhooks and provides steps to resolve them. It emphasizes ensuring endpoints are publicly accessible, correctly configured, and subscribed to relevant events. It also guides users on interpreting error messages and seeking support. ```APIDOC Webhook Troubleshooting: Common Issues & Solutions: - Endpoint Accessibility: - Ensure your endpoint is publicly accessible. - Verify it can accept POST requests. - Configuration: - Double-check the webhook endpoint URL is correctly configured. - Confirm webhooks are subscribed to the intended events. - Error Messages: - Review error messages from the webhook service for diagnostic information. - Seeking Support: - If errors persist and are suspected to be on the systeme.io side, contact support. - Provide context: webhook ID/name, non-working subscribed events, and error messages. Related Resources: - API Recipes: https://developer.systeme.io/docs/api-recipes-and-how-to-use-them - Webhook Events: https://developer.systeme.io/docs/webhooks-events ``` -------------------------------- ### Create Webhook Resource (cURL Example) Source: https://developer.systeme.io/reference/api_webhooks_post Example using cURL to send a POST request to create a webhook resource. It includes necessary headers for JSON content type and acceptance. ```curl curl --request POST \ --url https://api.systeme.io/api/webhooks \ --header 'accept: application/json' \ --header 'content-type: application/json' ``` -------------------------------- ### Optin Webhook Payload Example Source: https://developer.systeme.io/docs/new-optin This is an example of the JSON payload received when an optin event occurs. It contains detailed information about the contact, including their ID, email, registration details, custom fields, and associated tags. ```JSON { "contact": { "id": 12345, "email": "email@example.com", "registeredAt": "2024-01-01T00:00:00+00:00", "locale": "en", "sourceURL": "https://webhook-optin.systeme.io/123456aa?utm_source=123", "unsubscribed": false, "bounced": false, "needsConfirmation": false, "fields": [ { "fieldName": "first_name", "slug": "first_name", "value": "John" }, { "fieldName": "last_name", "slug": "last_name", "value": "Doe" } ], "tags": [ { "id": 1, "name": "some_tag" }, { "id": 2, "name": "another_tag" } ] } } ``` -------------------------------- ### Retrieve All Tags (cURL Example) Source: https://developer.systeme.io/reference/api_tags_id_get Example cURL request to retrieve a collection of all Tag resources from the Systeme.io API. This demonstrates how to make a GET request to the /api/tags/ endpoint with the appropriate Accept header. ```curl curl --request GET \ --url https://api.systeme.io/api/tags/ \ --header 'accept: application/json' ``` -------------------------------- ### Example Recipe Output Source: https://developer.systeme.io/docs This snippet shows a successful execution of an API recipe, returning a JSON object indicating success. ```shell 1{"success":true} ``` -------------------------------- ### cURL Request Example Source: https://developer.systeme.io/reference/post_contact_tag Example of how to assign a tag to a contact using cURL. This demonstrates the POST request method, the endpoint URL, and the necessary content type header. ```curl curl --request POST \ --url https://api.systeme.io/api/contacts//tags \ --header 'content-type: application/json' ``` -------------------------------- ### Webhook Request Example Source: https://developer.systeme.io/docs/webhooks Illustrates a typical POST request for a webhook, including essential headers for delivery tracking and event identification, and a sample JSON body representing contact data. ```HTTP POST / HTTP/1.1 X-Webhook-Delivery-Attempt-Id: 01HV1G8MT4Y24V3CD7FGFVE075 X-Webhook-Delivery-Attempt-Timestamp: 2024-04-09T13:20:24+00:00 X-Webhook-Event: CONTACT_CREATED X-Webhook-Event-Timestamp: 2024-04-09T12:17:40+00:00 X-Webhook-Message-Id: 01HV1F3DSF72G1RJWRFBSKY550 X-Webhook-Signature: 2ccb0b203538d27c58a218f8fb864e6f66317c520007ce9765919c2ca4a8292c X-Webhook-Subscription-Id: 01HV1BP7T3N981SM7R8F0ZM8YS ``` ```JSON { "contact": { "id": 12345, "email": "email@example.com", "registeredAt": "2024-01-01T00:00:00+00:00", "locale": "en", "sourceURL": null, "unsubscribed": false, "bounced": false, "needsConfirmation": false, "fields": [ { "fieldName": "first_name", "slug": "first_name", "value": "John" }, { "fieldName": "last_name", "slug": "last_name", "value": "Doe" } ], "tags": [ { "id": 1, "name": "some_tag" }, { "id": 2, "name": "another_tag" } ] } } ``` -------------------------------- ### Execute a Recipe Source: https://developer.systeme.io/docs/api-recipes-and-how-to-use-them This snippet demonstrates how to execute a recipe. It assumes you have prepared your environment, including installing PHP and Composer, and have copied the correct script with valid credentials. The output indicates success. ```shell 1 ``` -------------------------------- ### cURL Request Example for Creating Membership Source: https://developer.systeme.io/reference/api_communitycommunities_communityidmemberships_post Example cURL request to create a membership resource in a community. ```curl curl --request POST \ --url https://api.systeme.io/api/community/communities//memberships \ --header 'accept: application/json' \ --header 'content-type: application/json' ``` -------------------------------- ### New Sale Webhook Payload Example Source: https://developer.systeme.io/docs/webhooks-events-new-sale This is an example of the JSON payload received when a new sale occurs in systeme.io. It contains detailed information about the customer, order, coupon, and purchased items. ```JSON { "customer": { "id": 12345, "clientIp": "dbad:0dad:6d09:3123:548f:712b:96dc:62e5", "contactId": 12345, "email": "email@example.com", "fields": { "company_name": "Super company", "postcode": "12345", "phone_number": "1234567890", "surname": "Doe", "country": "US", "first_name": "John" }, "paymentProcessor": "stripe", "sourceUrl": "https:\/\/example.com\/some-page" }, "coupon": { "innerName": "Coupon 123", "code": "C123", "discountAmount": 1234, "discountType": "fixed", "expirationDate": "2025-02-07T12:34:56+00:00", "limitOfUse": 12 }, "funnelStep": { "id": 12345, "name": "Beautiful funnel step", "type": "offer-form", "funnel": { "id": 12345, "name": "Beautiful funnel" } }, "order": { "id": 12345, "createdAt": "2025-02-06T12:34:56+00:00", "discountAmount": null, "discountType": null, "shippingFee": null, "totalPrice": null, "vat": null }, "orderItem": { "createdAt": "2025-02-06T12:34:56+00:00", "id": 12345, "resources": [ { "course": null, "courseBundle": null, "enrollmentAccessType": null, "enrollmentDrippingAccessCourse": null, "physicalProduct": { "id": 12345, "name": "Marketeur Booster", "options": [] }, "tag": null } ] }, "pricePlan": { "id": 94283, "name": "Custom price plan", "type": "one_shot", "amount": 1234, "currency": "eur", "innerName": "PP1", "recurringOptions": null, "statementDescriptor": "" } } ``` -------------------------------- ### Create ContactField (cURL Example) Source: https://developer.systeme.io/reference/api_contact_fields_post Example cURL request to create a new ContactField resource in Systeme.io. ```curl curl --request POST \ --url https://api.systeme.io/api/contact_fields \ --header 'accept: application/json' \ --header 'content-type: application/json' ``` -------------------------------- ### cURL Request Example for Tags Source: https://developer.systeme.io/reference/api_tags_id_put Example cURL request for interacting with the Systeme.io API, specifically for tag-related operations. ```curl curl --request PUT \ --url https://api.systeme.io/api/tags/ \ --header 'accept: application/json' \ --header 'content-type: application/json' ``` -------------------------------- ### Include Composer Autoloader Source: https://developer.systeme.io/docs/api-recipes-and-how-to-use-them This snippet demonstrates how to include the Composer autoloader in a PHP script, which is necessary for using libraries installed via Composer. ```PHP 'https://api.systeme.io/api/', // Base API URI 'headers' => [ 'X-API-Key' => API_KEY, // Your API key 'Content-Type' => 'application/json', // Default content type ] ]); $contactCreatedResponse = $client->request('POST', 'contacts', [ 'body' => json_encode([ 'email' => 'example@email.com', 'locale' => 'en', 'fields' => [ [ 'slug' => 'country', 'value' => 'FR', ], [ 'slug' => 'phone_number', 'value' => '123456', ], ], ]), ]); $decodedResponse = json_decode($contactCreatedResponse->getContent(), true); $contactId = $decodedResponse['id']; $tagCreatedResponse = $client->request('POST', 'tags', [ 'body' => json_encode([ 'name' => 'my_tag' . uniqid() ]), ]); $decodedResponse = json_decode($tagCreatedResponse->getContent(), true); $tagId = $decodedResponse['id']; $client->request('POST', "contacts/{$contactId}/tags", [ 'body' => json_encode([ 'tagId' => $tagId ]), ]); ``` -------------------------------- ### Systeme.io API - School Course and Enrollment Management Source: https://developer.systeme.io/reference/school APIs for managing school courses and enrollments. Includes retrieving course collections, creating enrollments, and managing enrollment resources. ```APIDOC GET /api/school/courses - Retrieves the collection of Course resources. - Query Params: - active (boolean): Filter by active state. - query (string): Filter by course, lecture or module name. - limit (integer): Cursor-based pagination limit (10 to 100). - startingAfter (integer): Cursor-based pagination starting after this ID. - order (string): Cursor-based pagination initial ordering (asc, desc). POST /api/school/courses/{courseId}/enrollments - Creates an Enrollment resource. GET /api/school/enrollments - Retrieves the collection of Enrollment resources. DELETE /api/school/enrollments/{id} - Removes the Enrollment resource. ``` -------------------------------- ### Systeme.io Webhook API - GET by ID Source: https://developer.systeme.io/reference/api_webhooks_id_get Retrieves a specific Webhook resource by its ID. Use this endpoint to get details of a single webhook. ```APIDOC GET /webhooks/{id} Description: Retrieves a Webhook resource by its ID. Parameters: - id (string, required): The unique identifier of the webhook. Returns: A single Webhook resource object. Example: GET https://api.systeme.io/v1/webhooks/whk_abc123xyz ``` -------------------------------- ### Systeme.io API - School Course and Enrollment Management Source: https://developer.systeme.io/reference/tag Endpoints for managing School Courses and Enrollments. Allows retrieval of course collections, creation of enrollments, and management of enrollment resources. ```APIDOC GET /api/school/courses Description: Retrieves the collection of Course resources. POST /api/school/courses/{courseId}/enrollments Description: Creates an Enrollment resource. GET /api/school/enrollments Description: Retrieves the collection of Enrollment resources. DELETE /api/school/enrollments/{id} Description: Removes the Enrollment resource. ``` -------------------------------- ### Systeme.io Webhook API - GET by ID Source: https://developer.systeme.io/reference/api_webhooks_get_collection Retrieves a specific Webhook resource by its ID. Use this endpoint to get details of a single webhook. ```APIDOC GET /webhooks/{id} Description: Retrieves a Webhook resource by its ID. Parameters: - id (string, required): The unique identifier of the webhook. Returns: A single Webhook resource object. Example: GET https://api.systeme.io/v1/webhooks/whk_abc123xyz ``` -------------------------------- ### Prepare Dependencies with Composer Source: https://developer.systeme.io/docs Sets up a new directory with `composer.json` and a `recipe.php` file. The `composer.json` defines project dependencies, including PHP version and Symfony HTTP client. The `recipe.php` contains the core logic for interacting with the systeme.io API. ```json { "type": "project", "require": { "php": "^8.3", "symfony/http-client": "*" } } ``` ```php 'https://api.systeme.io/api/', // Base API URI 'headers' => [ 'X-API-Key' => API_KEY, // Your API key 'Content-Type' => 'application/json', // Default content type ] ]); $contactCreatedResponse = $client->request('POST', 'contacts', [ 'body' => json_encode([ 'email' => 'example@email.com', 'locale' => 'en', 'fields' => [ [ 'slug' => 'country', 'value' => 'FR', ], [ 'slug' => 'phone_number', 'value' => '123456', ], ], ]), ]); $decodedResponse = json_decode($contactCreatedResponse->getContent(), true); $contactId = $decodedResponse['id']; $tagCreatedResponse = $client->request('POST', 'tags', [ 'body' => json_encode([ 'name' => 'my_tag' . uniqid() ]), ]); $decodedResponse = json_decode($tagCreatedResponse->getContent(), true); $tagId = $decodedResponse['id']; $client->request('POST', "contacts/{$contactId}/tags", [ 'body' => json_encode([ 'tagId' => $tagId ]), ]); ``` -------------------------------- ### Systeme.io Webhook API - GET by ID Source: https://developer.systeme.io/reference/api_contacts_id_patch Retrieves a specific Webhook resource by its ID. Use this endpoint to get details of a single webhook. ```APIDOC GET /webhooks/{id} Description: Retrieves a Webhook resource by its ID. Parameters: - id (string, required): The unique identifier of the webhook. Returns: A single Webhook resource object. Example: GET https://api.systeme.io/v1/webhooks/whk_abc123xyz ``` -------------------------------- ### Delete Membership (cURL Example) Source: https://developer.systeme.io/reference/api_communitymemberships_id_delete Example cURL request to delete a Membership resource using the DELETE HTTP method. Demonstrates the URL structure and the DELETE method. ```curl curl --request DELETE \ --url https://api.systeme.io/api/community/memberships/ ``` -------------------------------- ### Systeme.io API - School Course and Enrollment Management Source: https://developer.systeme.io/reference/contact Endpoints for managing school courses and enrollments. Allows retrieval of courses, creation of enrollments, and management of individual enrollments. ```APIDOC GET /school/courses Description: Retrieves the collection of Course resources. POST /school/courses/{courseId}/enrollments Description: Creates an Enrollment resource. GET /school/enrollments Description: Retrieves the collection of Enrollment resources. DELETE /school/enrollments/{id} Description: Removes the Enrollment resource. ``` -------------------------------- ### Systeme.io Public API Reference Source: https://developer.systeme.io/reference/api_tags_post Comprehensive API documentation for Systeme.io, detailing operations for various resources. Includes endpoints for managing memberships, contact fields, contacts, subscriptions, school enrollments, courses, tags, and webhooks. ```APIDOC Systeme.io Public API Documentation: Base URL: https://developer.systeme.io/reference/api Community Memberships: DELETE /community/memberships/{id} Removes the Membership resource. Parameters: - id: The ID of the membership to remove. GET /community/memberships Retrieves the collection of Membership resources. POST /community/communities/{communityId}/memberships Creates a Membership resource. Parameters: - communityId: The ID of the community. Communities: GET /community/communities Retrieves the collection of Community resources. Contact Fields: PATCH /contact-fields/{slug} Updates the ContactField resource. Parameters: - slug: The slug of the contact field to update. DELETE /contact-fields/{slug} Removes the ContactField resource. Parameters: - slug: The slug of the contact field to remove. POST /contact-fields Creates a ContactField resource. GET /contact-fields Retrieves the collection of ContactField resources. Contacts: DELETE /contacts/{contactId}/tags/{tagId} Removes a Tag from a Contact. Parameters: - contactId: The ID of the contact. - tagId: The ID of the tag to remove. POST /contacts/{contactId}/tags Assigns a Tag to a Contact. Parameters: - contactId: The ID of the contact. PATCH /contacts/{id} Updates the Contact resource. Parameters: - id: The ID of the contact to update. DELETE /contacts/{id} Removes the Contact resource. Parameters: - id: The ID of the contact to remove. GET /contacts/{id} Retrieves a Contact resource. Parameters: - id: The ID of the contact to retrieve. GET /contacts Retrieves the collection of Contact resources. Subscriptions: POST /cancel-subscription Unsubscribes a user. GET /payments/subscriptions Retrieves the collection of Subscription resources. School Enrollments: DELETE /school/enrollments/{id} Removes the Enrollment resource. Parameters: - id: The ID of the enrollment to remove. GET /school/enrollments Retrieves the collection of Enrollment resources. POST /school/courses/{courseId}/enrollments Creates an Enrollment resource. Parameters: - courseId: The ID of the course. Courses: GET /school/courses Retrieves the collection of Course resources. Tags: DELETE /tags/{id} Removes the Tag resource. Parameters: - id: The ID of the tag to remove. PUT /tags/{id} Replaces the Tag resource. Parameters: - id: The ID of the tag to replace. GET /tags/{id} Retrieves a Tag resource. Parameters: - id: The ID of the tag to retrieve. POST /tags Creates a Tag resource. GET /tags Retrieves the collection of Tag resources. Webhooks: PATCH /webhooks/{id} Updates the Webhook resource. Parameters: - id: The ID of the webhook to update. DELETE /webhooks/{id} Removes the Webhook resource. Parameters: - id: The ID of the webhook to remove. GET /webhooks/{id} Retrieves a Webhook resource. Parameters: - id: The ID of the webhook to retrieve. POST /webhooks Creates a Webhook resource. GET /webhooks Retrieves the collection of Webhook resources. ``` -------------------------------- ### Example Sale Canceled Webhook Payload Source: https://developer.systeme.io/docs/webhooks-events-sale-canceled This is an example JSON payload for the 'Sale Canceled' webhook event. It demonstrates the structure and typical values for the fields defined in the payload definition. ```JSON { "customer": { "id": 12345, "clientIp": "dbad:0dad:6d09:3123:548f:712b:96dc:62e5", "contactId": 12345, "email": "email@example.com", "fields": { "company_name": "Super company", "postcode": "12345", "phone_number": "1234567890", "surname": "Doe", "country": "US", "first_name": "John" }, "paymentProcessor": "stripe", "sourceUrl": "https:\/\/example.com\/some-page" }, "coupon": { "innerName": "Coupon 123", "code": "C123", "discountAmount": 1234, "discountType": "fixed", "expirationDate": "2025-02-07T12:34:56+00:00", "limitOfUse": 12 }, "funnelStep": { "id": 12345, "name": "Beautiful funnel step", "type": "offer-form", "funnel": { "id": 12345, "name": "Beautiful funnel" } }, "order": { "id": 12345, "createdAt": "2025-02-06T12:34:56+00:00", "discountAmount": null, "discountType": null, "shippingFee": null, "totalPrice": null, "vat": null }, "orderItem": { "createdAt": "2025-02-06T12:34:56+00:00", "id": 12345, "resources": [ { "course": null, "courseBundle": null, "enrollmentAccessType": null, "enrollmentDrippingAccessCourse": null, "physicalProduct": { "id": 12345, "name": "Marketeur Booster", "options": [] }, "tag": null } ] }, "pricePlan": { "id": 94283, "name": "Custom price plan", "type": "one_shot", "amount": 1234, "currency": "eur", "innerName": "PP1", "recurringOptions": null, "statementDescriptor": "" } } ``` -------------------------------- ### Systeme.io API - School Course and Enrollment Management Source: https://developer.systeme.io/reference/webhook Endpoints for managing School Courses and Enrollments. Allows retrieving course collections, creating enrollments, and managing individual enrollment resources. ```APIDOC GET /api/school/courses Description: Retrieves the collection of Course resources. POST /api/school/courses/{courseId}/enrollments Description: Creates an Enrollment resource. GET /api/school/enrollments Description: Retrieves the collection of Enrollment resources. DELETE /api/school/enrollments/{id} Description: Removes the Enrollment resource. ``` -------------------------------- ### Initialize Symfony HTTP Client for Systeme.io API Source: https://developer.systeme.io/docs This code demonstrates how to initialize the Symfony HTTP client to interact with the Systeme.io API. It configures the base URI for the API and sets necessary headers, including the API key and content type. This client simplifies making HTTP requests to the API endpoints. ```PHP 'https://api.systeme.io/api/', 'headers' => [ 'X-API-Key' => 'your_secret_api_key', 'Content-Type' => 'application/json', ] ]); ``` -------------------------------- ### Enrollment API Source: https://developer.systeme.io/reference/contact-tag-removed Creates an enrollment resource for a course. ```APIDOC POST /school/courses/{courseId}/enrollments Creates an enrollment resource. Parameters: courseId (string): The ID of the course to enroll in. Request Body: (Optional) May include enrollment details if applicable. Returns: 201 Created: Enrollment created successfully. 400 Bad Request: Invalid course ID or request body. 404 Not Found: Course not found. ``` -------------------------------- ### Systeme.io API - School Course and Enrollment Management Source: https://developer.systeme.io/reference/api_schoolcourses_get_collection APIs for managing school courses and enrollments. Includes retrieving course collections, creating enrollments, and managing enrollment resources. ```APIDOC GET /api/school/courses - Retrieves the collection of Course resources. - Query Params: - active (boolean): Filter by active state. - query (string): Filter by course, lecture or module name. - limit (integer): Cursor-based pagination limit (10 to 100). - startingAfter (integer): Cursor-based pagination starting after this ID. - order (string): Cursor-based pagination initial ordering (asc, desc). POST /api/school/courses/{courseId}/enrollments - Creates an Enrollment resource. GET /api/school/enrollments - Retrieves the collection of Enrollment resources. DELETE /api/school/enrollments/{id} - Removes the Enrollment resource. ``` -------------------------------- ### Retrieve Enrollments Source: https://developer.systeme.io/reference/api_schoolenrollments_get_collection Retrieves the collection of enrollment resources using a GET request. ```curl curl --request GET \ --url https://api.systeme.io/api/school/enrollments \ --header 'accept: application/json' ``` -------------------------------- ### Retrieve Contacts Source: https://developer.systeme.io/reference/contact Example cURL request to retrieve the collection of contact resources from the Systeme.io API. ```curl curl --request GET \ --url https://api.systeme.io/api/contacts \ --header 'accept: application/json' ``` -------------------------------- ### Systeme.io Public API Reference Source: https://developer.systeme.io/reference/post_contact_tag Comprehensive API documentation for Systeme.io, detailing operations for various resources. Includes endpoints for managing memberships, contact fields, contacts, subscriptions, school enrollments, courses, tags, and webhooks. ```APIDOC Systeme.io Public API Documentation: Base URL: https://developer.systeme.io/reference/api Community Memberships: DELETE /community/memberships/{id} Removes the Membership resource. Parameters: - id: The ID of the membership to remove. GET /community/memberships Retrieves the collection of Membership resources. POST /community/communities/{communityId}/memberships Creates a Membership resource. Parameters: - communityId: The ID of the community. Communities: GET /community/communities Retrieves the collection of Community resources. Contact Fields: PATCH /contact-fields/{slug} Updates the ContactField resource. Parameters: - slug: The slug of the contact field to update. DELETE /contact-fields/{slug} Removes the ContactField resource. Parameters: - slug: The slug of the contact field to remove. POST /contact-fields Creates a ContactField resource. GET /contact-fields Retrieves the collection of ContactField resources. Contacts: DELETE /contacts/{contactId}/tags/{tagId} Removes a Tag from a Contact. Parameters: - contactId: The ID of the contact. - tagId: The ID of the tag to remove. POST /contacts/{contactId}/tags Assigns a Tag to a Contact. Parameters: - contactId: The ID of the contact. PATCH /contacts/{id} Updates the Contact resource. Parameters: - id: The ID of the contact to update. DELETE /contacts/{id} Removes the Contact resource. Parameters: - id: The ID of the contact to remove. GET /contacts/{id} Retrieves a Contact resource. Parameters: - id: The ID of the contact to retrieve. GET /contacts Retrieves the collection of Contact resources. Subscriptions: POST /cancel-subscription Unsubscribes a user. GET /payments/subscriptions Retrieves the collection of Subscription resources. School Enrollments: DELETE /school/enrollments/{id} Removes the Enrollment resource. Parameters: - id: The ID of the enrollment to remove. GET /school/enrollments Retrieves the collection of Enrollment resources. POST /school/courses/{courseId}/enrollments Creates an Enrollment resource. Parameters: - courseId: The ID of the course. Courses: GET /school/courses Retrieves the collection of Course resources. Tags: DELETE /tags/{id} Removes the Tag resource. Parameters: - id: The ID of the tag to remove. PUT /tags/{id} Replaces the Tag resource. Parameters: - id: The ID of the tag to replace. GET /tags/{id} Retrieves a Tag resource. Parameters: - id: The ID of the tag to retrieve. POST /tags Creates a Tag resource. GET /tags Retrieves the collection of Tag resources. Webhooks: PATCH /webhooks/{id} Updates the Webhook resource. Parameters: - id: The ID of the webhook to update. DELETE /webhooks/{id} Removes the Webhook resource. Parameters: - id: The ID of the webhook to remove. GET /webhooks/{id} Retrieves a Webhook resource. Parameters: - id: The ID of the webhook to retrieve. POST /webhooks Creates a Webhook resource. GET /webhooks Retrieves the collection of Webhook resources. ```