{"files":{"SKILL.md":"---\nname: contribly\ndescription: \"Contribly API skill. Use when working with Contribly for artifact-formats, assignments, change-log. Covers 44 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# Contribly\nAPI version: 1.0.0\n\n## Auth\nOAuth2\n\n## Base URL\nhttps://api.contribly.com/1\n\n## Setup\n1. Configure auth: OAuth2\n2. GET /artifact-formats -- artifact formats\n3. POST /assignments -- create first assignment\n\n## Endpoints\n44 endpoints across 22 groups. See references/api-spec.lap for full details.\n\n### Artifact-formats\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /artifact-formats | Artifact formats |\n\n### Assignments\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /assignments | List assignments |\n| POST | /assignments | Create a new assignment |\n| DELETE | /assignments/{id} | Delete this assignment and all of it's contributions |\n| GET | /assignments/{id} | Get a single assigment by id |\n\n### Change-log\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /change-log | Recent changes |\n\n### Contribution-refinements\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /contribution-refinements | List contribution refinement options |\n\n### Contribution-refinement-types\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /contribution-refinement-types | List valid contribution refinement types |\n\n### Export\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /export | Export contributions. |\n\n### Export-summary\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /export-summary | Export contributions preflight summary. |\n\n### Exports\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /exports/{id} | Get a single export job; poll to follow export progress. |\n\n### Contributions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /contributions | List contributions |\n| POST | /contributions | Create a new contribution |\n| GET | /contributions/{id} | Get a single contribution by id |\n| DELETE | /contributions/{id} | Delete this contribution |\n| POST | /contributions/{id}/flag | Raise a flag against this contribution |\n| POST | /contributions/{id}/like | Allows a user to mark a contribution as liked |\n| GET | /contributions/{id}/likes | List users who have liked this contributions |\n| POST | /contributions/{id}/moderate | Perform a moderation action on this contribution |\n\n### Credentials\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /credentials | List the credentials associated with the authenticated user. |\n\n### Event-types\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /event-types | Event types |\n\n### Forms\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /forms | List forms |\n| POST | /forms | Create a form |\n| GET | /forms/{id} | Get a single form by id |\n| DELETE | /forms/{id} | Delete this form and all of it's responses. |\n\n### Form-responses\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /form-responses | Submit a response to a form |\n| GET | /form-responses | List form responses |\n| GET | /form-responses/{id} | Get a single form response by id |\n\n### Media\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /media | Submit a new media file |\n\n### Notifications\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /notifications/contributions/{id}/preview |  |\n\n### Scopes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /scopes | Scopes |\n\n### Subscriptions\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /subscriptions | List subscriptions for the authorised user. |\n| DELETE | /subscriptions/{id} | Delete a subscription. |\n\n### Subscription-types\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /subscription-types | Subscription types |\n\n### Tags\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tags | List tags |\n| POST | /tags | Create a new tag |\n| GET | /tags/{id} | Retrieve a single tag by id |\n\n### Tagsets\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /tagsets | List tag sets |\n| POST | /tagsets | Create a new tag set |\n| GET | /tagsets/{id} | Retrieve a single tag set by id |\n\n### Users\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /users | List users |\n| GET | /users/{id} | Retrieve a single user by id |\n| GET | /users/{id}/linked/{type} | Retrieve a users linked profile by type |\n\n### Verify\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /verify | Verify token and return details of the owning user |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all artifact-formats?\" -> GET /artifact-formats\n- \"Search assignments?\" -> GET /assignments\n- \"Create a assignment?\" -> POST /assignments\n- \"Delete a assignment?\" -> DELETE /assignments/{id}\n- \"Get assignment details?\" -> GET /assignments/{id}\n- \"List all change-log?\" -> GET /change-log\n- \"Search contribution-refinements?\" -> GET /contribution-refinements\n- \"List all contribution-refinement-types?\" -> GET /contribution-refinement-types\n- \"Create a export?\" -> POST /export\n- \"Create a export-summary?\" -> POST /export-summary\n- \"Get export details?\" -> GET /exports/{id}\n- \"Search contributions?\" -> GET /contributions\n- \"Create a contribution?\" -> POST /contributions\n- \"Get contribution details?\" -> GET /contributions/{id}\n- \"Delete a contribution?\" -> DELETE /contributions/{id}\n- \"Create a flag?\" -> POST /contributions/{id}/flag\n- \"Create a like?\" -> POST /contributions/{id}/like\n- \"List all likes?\" -> GET /contributions/{id}/likes\n- \"Create a moderate?\" -> POST /contributions/{id}/moderate\n- \"List all credentials?\" -> GET /credentials\n- \"List all event-types?\" -> GET /event-types\n- \"List all forms?\" -> GET /forms\n- \"Create a form?\" -> POST /forms\n- \"Get form details?\" -> GET /forms/{id}\n- \"Delete a form?\" -> DELETE /forms/{id}\n- \"Create a form-response?\" -> POST /form-responses\n- \"List all form-responses?\" -> GET /form-responses\n- \"Get form-response details?\" -> GET /form-responses/{id}\n- \"Create a media?\" -> POST /media\n- \"List all preview?\" -> GET /notifications/contributions/{id}/preview\n- \"List all scopes?\" -> GET /scopes\n- \"List all subscriptions?\" -> GET /subscriptions\n- \"Delete a subscription?\" -> DELETE /subscriptions/{id}\n- \"List all subscription-types?\" -> GET /subscription-types\n- \"List all tags?\" -> GET /tags\n- \"Create a tag?\" -> POST /tags\n- \"Get tag details?\" -> GET /tags/{id}\n- \"List all tagsets?\" -> GET /tagsets\n- \"Create a tagset?\" -> POST /tagsets\n- \"Get tagset details?\" -> GET /tagsets/{id}\n- \"List all users?\" -> GET /users\n- \"Get user details?\" -> GET /users/{id}\n- \"Get linked details?\" -> GET /users/{id}/linked/{type}\n- \"Create a verify?\" -> POST /verify\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api Contribly\n@base https://api.contribly.com/1\n@version 1.0.0\n@auth OAuth2\n@endpoints 44\n@hint download_for_search\n@toc artifact-formats(1), assignments(4), change-log(1), contribution-refinements(1), contribution-refinement-types(1), export(1), export-summary(1), exports(1), contributions(8), credentials(1), event-types(1), forms(4), form-responses(3), media(1), notifications(1), scopes(1), subscriptions(2), subscription-types(1), tags(3), tagsets(3), users(3), verify(1)\n\n@group artifact-formats\n@endpoint GET /artifact-formats\n@desc Artifact formats\n@returns(200) A list of artifact formats\n\n@endgroup\n\n@group assignments\n@endpoint GET /assignments\n@desc List assignments\n@optional {ownedBy: any # Restrict results to assignments owned by this user., page: any # Pagination page, pageSize: any # Pagination page size, q: any # Restrict results to assignments whose name or description matches this keyword., urlWords: any # Select an assignment by urlWords., open: any # Select open or closed assignments, alwaysOpen: any # Select assignments with no closing date., tag: any # Restrict results to assignments which are tagged with this tag., name: any # Restrict results to the assignment (or potentially assignments) with this exact name}\n@returns(200) A list of assignments\n\n@endpoint POST /assignments\n@desc Create a new assignment\n@required {body: map # Assignment object to be created}\n@returns(200) Assignment created\n@errors {400: The new assignment vailed to validate. Check the response body for details., 500: Failed to create the new assignment due to an unexpected error.}\n\n@endpoint DELETE /assignments/{id}\n@desc Delete this assignment and all of it's contributions\n@required {id: any # Id of the assignment to return}\n@returns(200) Assignment deleted\n@errors {403: Not permitted to delete this assignment., 404: Not found}\n\n@endpoint GET /assignments/{id}\n@desc Get a single assigment by id\n@required {id: any # Id of the assignment to return}\n@returns(200) Assignment found\n@errors {404: Not found}\n\n@endgroup\n\n@group change-log\n@endpoint GET /change-log\n@desc Recent changes\n@returns(200) A list of change log items\n\n@endgroup\n\n@group contribution-refinements\n@endpoint GET /contribution-refinements\n@desc List contribution refinement options\n@optional {assignment: any # Restrict results to contributions submitted to this assignment., country: any # Limit results to contributions which have a publicly visible location within the given country (specified by two letter country code)., createdBefore: any # Limit results to contributions created before this date time., createdAfter: any # Limit results to contributions created after this date time., geohash: any # Restrict results to contributions which have specified a location which falls within this geohash (or comma seperated list of multiple geohashes), hasLocation: any # Restrict results to contributions which have a publicly visible location., latLong: any # Limit results to contributions with location near this latitude and longitude (comma seperated lat/long pair). Also see radius, radius: any # When limiting result by location with the latLong parameter, specify the radius in kilometers., mediaType: any # Restrict results to contributions which include a media file of the given type (ie. image / video), ownedBy: any # Restrict results to contributions which are fall under the jurisdiction by this user., q: any # Restrict results to contributions whose headline text matches this keyword., urlWords: any # Locate a specific contribution by URL words, user: any # Restrict results to contributions by this user identified by id., refinements: any # Comma seperated list of refinement names., refinementSize: any # Number of refinement options to return.}\n@returns(200) A map of refinement names to lists of options\n\n@endgroup\n\n@group contribution-refinement-types\n@endpoint GET /contribution-refinement-types\n@desc List valid contribution refinement types\n@returns(200) An array of refinement types. These are the possible values of the get contribution refinements parameter.\n\n@endgroup\n\n@group export\n@endpoint POST /export\n@desc Export contributions.\n@optional {assignment: any # Restrict results to contributions submitted to this assignment., country: any # Limit results to contributions which have a publicly visible location within the given country (specified by two letter country code)., createdBefore: any # Limit results to contributions created before this date time., createdAfter: any # Limit results to contributions created after this date time., geohash: any # Restrict results to contributions which have specified a location which falls within this geohash (or comma seperated list of multiple geohashes), hasLocation: any # Restrict results to contributions which have a publicly visible location., latLong: any # Limit results to contributions with location near this latitude and longitude (comma seperated lat/long pair). Also see radius, radius: any # When limiting result by location with the latLong parameter, specify the radius in kilometers., mediaType: any # Restrict results to contributions which include a media file of the given type (ie. image / video), ownedBy: any # Restrict results to contributions which are fall under the jurisdiction by this user., q: any # Restrict results to contributions whose headline text matches this keyword., urlWords: any # Locate a specific contribution by URL words, user: any # Restrict results to contributions by this user identified by id., tagged: any # Should exported media files be tagged with metadata. Deprecated; use format instead., combined: any # Included a combined file with all contribution text., individual: any # Include individual text files for each contribution., format: any # Media format to export; none, fullsize, tagged or original., json: any # Include raw JSON for each contribution.}\n@returns(202) An export job describing the state of an export job.\n\n@endgroup\n\n@group export-summary\n@endpoint POST /export-summary\n@desc Export contributions preflight summary.\n@optional {assignment: any # Restrict results to contributions submitted to this assignment., country: any # Limit results to contributions which have a publicly visible location within the given country (specified by two letter country code)., createdBefore: any # Limit results to contributions created before this date time., createdAfter: any # Limit results to contributions created after this date time., geohash: any # Restrict results to contributions which have specified a location which falls within this geohash (or comma seperated list of multiple geohashes), hasLocation: any # Restrict results to contributions which have a publicly visible location., latLong: any # Limit results to contributions with location near this latitude and longitude (comma seperated lat/long pair). Also see radius, radius: any # When limiting result by location with the latLong parameter, specify the radius in kilometers., mediaType: any # Restrict results to contributions which include a media file of the given type (ie. image / video), ownedBy: any # Restrict results to contributions which are fall under the jurisdiction by this user., q: any # Restrict results to contributions whose headline text matches this keyword., urlWords: any # Locate a specific contribution by URL words, user: any # Restrict results to contributions by this user identified by id.}\n@returns(200) A summary of the number of contributions, media files and approximate total size of media files.\n\n@endgroup\n\n@group exports\n@endpoint GET /exports/{id}\n@desc Get a single export job; poll to follow export progress.\n@required {id: any # Id of the export job to return}\n@returns(200) Successful\n@errors {404: Not found}\n\n@endgroup\n\n@group contributions\n@endpoint GET /contributions\n@desc List contributions\n@optional {assignment: any # Restrict results to contributions submitted to this assignment., country: any # Limit results to contributions which have a publicly visible location within the given country (specified by two letter country code)., createdBefore: any # Limit results to contributions created before this date time., createdAfter: any # Limit results to contributions created after this date time., createdDay: any # Limit results to contributions created on this day., createdMonth: any # Limit results to contributions created during this month., geohash: any # Restrict results to contributions which have specified a location which falls within this geohash (or comma seperated list of multiple geohashes), hasLocation: any # Restrict results to contributions which have a publicly visible location., latLong: any # Limit results to contributions with location near this latitude and longitude (comma seperated lat/long pair). Also see radius, radius: any # When limiting result by location with the latLong parameter, specify the radius in kilometers., mediaType: any # Restrict results to contributions which include a media file of the given type (ie. image / video), ownedBy: any # Restrict results to contributions which are fall under the jurisdiction by this user., q: any # Restrict results to contributions whose headline text matches this keyword., urlWords: any # Locate a specific contribution by URL words, user: any # Restrict results to contributions by this user identified by id., ids: any # Restrict results to a list of specific contributions identified by a comma seperated list of ids., format: any # Select output format. 'json' or 'rss'. Defaults to JSON.}\n@returns(200) A list of contributions\n\n@endpoint POST /contributions\n@desc Create a new contribution\n@required {body: map # Contribution object to be created}\n@returns(200) Contribution created\n\n@endpoint GET /contributions/{id}\n@desc Get a single contribution by id\n@required {id: any # Id of the contribution to return}\n@returns(200) Successful\n@errors {404: Not found}\n\n@endpoint DELETE /contributions/{id}\n@desc Delete this contribution\n@required {id: any # Id of the contribution to delete}\n@returns(200) The deletion request has been accepted and will be processed in the background.\n@errors {403: The currently authorised user is not allowed to delete this contribution., 404: Not found}\n\n@endpoint POST /contributions/{id}/flag\n@desc Raise a flag against this contribution\n@required {id: any # Id of the contribution to flag, body: map # Flag to be created}\n@returns(200) Flag created\n\n@endpoint POST /contributions/{id}/like\n@desc Allows a user to mark a contribution as liked\n@required {id: any # Id of the contribution}\n@returns(200) The updated like count for this contribution.\n\n@endpoint GET /contributions/{id}/likes\n@desc List users who have liked this contributions\n@required {id: any # Id of the contribution}\n@returns(200) A list of user ids.\n\n@endpoint POST /contributions/{id}/moderate\n@desc Perform a moderation action on this contribution\n@required {id: any # Id of the contribution to moderate, body: map # A moderation action}\n@returns(200) The moderation action was successfully applied\n@errors {400: The submission falied to validate. Check the response body for details., 401: The request was not correctly authorised., 403: You do not have permission to perform this moderation action., 500: An unexpected error occurred.}\n\n@endgroup\n\n@group credentials\n@endpoint GET /credentials\n@desc List the credentials associated with the authenticated user.\n@returns(200) A list of credentials associated with this user.\n@errors {401: Not authorised}\n\n@endgroup\n\n@group event-types\n@endpoint GET /event-types\n@desc Event types\n@returns(200) A list of event types\n\n@endgroup\n\n@group forms\n@endpoint GET /forms\n@desc List forms\n@required {ownedBy: any # Restrict results to forms owned by this user.}\n@returns(200) A list of forms\n\n@endpoint POST /forms\n@desc Create a form\n@required {body: map # Form object to be created}\n@returns(200) Form created\n\n@endpoint GET /forms/{id}\n@desc Get a single form by id\n@required {id: any # Id of the form to return}\n@returns(200) Form found\n@errors {404: Not found}\n\n@endpoint DELETE /forms/{id}\n@desc Delete this form and all of it's responses.\n@required {id: any # Id of the form to delete}\n@returns(200) Form deleted\n@errors {404: Not found}\n\n@endgroup\n\n@group form-responses\n@endpoint POST /form-responses\n@desc Submit a response to a form\n@required {body: map # Form response}\n@returns(200) Form response saved\n\n@endpoint GET /form-responses\n@desc List form responses\n@optional {user: any # Restrict results to responses submitted by this user., form: any # Restrict results to responses submitted to this form., contribution: any # Restrict results to responses relating to this contribution.}\n@returns(200) A list of form responses\n\n@endpoint GET /form-responses/{id}\n@desc Get a single form response by id\n@required {id: any # Id of the assignment to return}\n@returns(200) Form response found\n@errors {404: Not found}\n\n@endgroup\n\n@group media\n@endpoint POST /media\n@desc Submit a new media file\n@required {body: str(byte) # Binary media file}\n@returns(200) Media created\n\n@endgroup\n\n@group notifications\n@endpoint GET /notifications/contributions/{id}/preview\n@required {id: any # Id of the contribution to preview a notification for, message: any # Type of message to preview.}\n@returns(200) Notification preview\n\n@endgroup\n\n@group scopes\n@endpoint GET /scopes\n@desc Scopes\n@returns(200) A list of scopes\n\n@endgroup\n\n@group subscriptions\n@endpoint GET /subscriptions\n@desc List subscriptions for the authorised user.\n@required {body: map # Subscription to be created}\n@returns(200) A list of notification subscriptions\n\n@endpoint DELETE /subscriptions/{id}\n@desc Delete a subscription.\n@required {id: any # Id of the subscription to delete}\n@returns(200) The subscription has been successfully deleted.\n\n@endgroup\n\n@group subscription-types\n@endpoint GET /subscription-types\n@desc Subscription types\n@returns(200) A list of subscription event types\n\n@endgroup\n\n@group tags\n@endpoint GET /tags\n@desc List tags\n@optional {ownedBy: any # Restrict results to those owned by this user., tagSet: any # Restrict results to tags belonging to this tag set., urlWords: any # Restrict results by urlWords. Should be used with ownedBy when searching for one of your own tags.}\n@returns(200) A list of tags\n\n@endpoint POST /tags\n@desc Create a new tag\n@required {body: map # Tag object to be created}\n@returns(200) Tag created\n@errors {400: The new tag submission failed to validate. Check the response body for details., 500: Failed to create the new tag due to an unexcepted error.}\n\n@endpoint GET /tags/{id}\n@desc Retrieve a single tag by id\n@required {id: any # Id of the tag to return}\n@returns(200) The tag\n@errors {404: Not found}\n\n@endgroup\n\n@group tagsets\n@endpoint GET /tagsets\n@desc List tag sets\n@optional {ownedBy: any # Restrict results to those owned by this user., urlWords: any # Restrict results by urlWords. Should be used with ownedBy when searching for one of your own tag sets.}\n@returns(200) A list of tag sets\n\n@endpoint POST /tagsets\n@desc Create a new tag set\n@required {body: map # Tag set to be created}\n@returns(200) Tagset created\n\n@endpoint GET /tagsets/{id}\n@desc Retrieve a single tag set by id\n@required {id: any # Id of the tag set to return}\n@returns(200) The tag set\n@errors {404: Not found}\n\n@endgroup\n\n@group users\n@endpoint GET /users\n@desc List users\n@optional {assignment: any # Restrict results to the users who have contributed to this assignment., country: any # Restrict results to the users who have submitted a contribution with a public location located within this country., minimumContributions: any # Restrict results to the users who have submitted at least this many contributions., linkedProfile: any # Restrict results to the users who a linked profile of this type., ownedBy: any # Restrict results to the users who are owned by of this owner., submittedBefore: any # Limit results to users who have submitted at least one contribution before this date time., submittedAfter: any # Limit results to users who have submitted at least one contribution after this date time., username: any # Restrict results to the user with this username.}\n@returns(200) A list of users\n\n@endpoint GET /users/{id}\n@desc Retrieve a single user by id\n@required {id: any # Id of the user to return}\n@returns(200) Successful\n@errors {404: Not found}\n\n@endpoint GET /users/{id}/linked/{type}\n@desc Retrieve a users linked profile by type\n@required {id: any # Id of the user to return, type: any # Type of the linked profile to fetch}\n@returns(200) Successful\n@errors {404: Not found}\n\n@endgroup\n\n@group verify\n@endpoint POST /verify\n@desc Verify token and return details of the owning user\n@returns(200) Token is valid\n\n@endgroup\n\n@end\n"}}