{"files":{"SKILL.md":"---\nname: seven\ndescription: \"seven API skill. Use when working with seven for analytics, balance, contacts. Covers 51 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# seven\nAPI version: 1.0.0\n\n## Auth\nOAuth2\n\n## Base URL\nhttps://gateway.seven.io/api\n\n## Setup\n1. Configure auth: OAuth2\n2. GET /analytics/country -- get analytics by country\n3. POST /contacts -- create first contact\n\n## Endpoints\n51 endpoints across 16 groups. See references/api-spec.lap for full details.\n\n### Analytics\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /analytics/country | Get Analytics By Country |\n| GET | /analytics/date | Get Analytics By Date |\n| GET | /analytics/label | Get Analytics By Label |\n| GET | /analytics/subaccount | Get Analytics By Label |\n\n### Balance\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /balance | Get Balance |\n\n### Contacts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /contacts | List Contacts |\n| POST | /contacts | Create Contact |\n| DELETE | /contacts/{id} | Delete Contact |\n| GET | /contacts/{id} | Get Contact |\n| PATCH | /contacts/{id} | Update Contact |\n\n### Groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /groups | List Groups |\n| POST | /groups | Create Group |\n| DELETE | /groups/{id} | Delete Group |\n| GET | /groups/{id} | Get Group |\n| PATCH | /groups/{id} | Update Group |\n\n### Hooks\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /hooks | Delete Hook |\n| GET | /hooks | List Hooks |\n| POST | /hooks | Create Hook |\n\n### Journal\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /journal/outbound | Get outbound messages |\n| GET | /journal/inbound | Get inbound messages |\n| GET | /journal/replies | Get message replies |\n| GET | /journal/voice | Get voice journal |\n\n### Lookup\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /lookup/cnam | Lookup Caller Name |\n| GET | /lookup/format | Lookup Format |\n| GET | /lookup/hlr | Lookup HLR |\n| GET | /lookup/mnp | Lookup MNP |\n| GET | /lookup/rcs | Lookup RCS Capabilities |\n\n### Numbers\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /numbers/active | List Active Numbers |\n| DELETE | /numbers/active/{number} | Delete Number |\n| GET | /numbers/active/{number} | Get Number |\n| PATCH | /numbers/active/{number} | Update Number |\n| GET | /numbers/available | Get Available Numbers |\n| POST | /numbers/order | Order Number |\n\n### Pricing\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /pricing | Get Pricing |\n\n### Rcs\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /rcs/events | Trigger RCS Event |\n| POST | /rcs/messages | Send RCS |\n| DELETE | /rcs/messages/{id} | Delete RCS |\n\n### Sms\n| Method | Path | Description |\n|--------|------|-------------|\n| DELETE | /sms | Delete Sms |\n| POST | /sms | Send Sms |\n\n### Status\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /status | Get SMS Status |\n\n### Subaccounts\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /subaccounts/list | List Subaccounts |\n| POST | /subaccounts/create | Create Subaccount |\n| POST | /subaccounts/update | Automatic Balance Transfer |\n| POST | /subaccounts/transfer_credits | Manual Credit Transfer |\n| POST | /subaccounts/delete | Delete Subaccount |\n\n### Validate_for_voice\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /validate_for_voice | Validate Caller ID for Voice |\n\n### Voice\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /voice | Send text-to-speech Voice Call |\n| POST | /voice/{call_id}/hangup | End Voice Call |\n\n### Waba\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | /waba/messages | Send WhatsApp Message |\n| DELETE | /waba/messages/{id} | Delete WhatsApp Message |\n| POST | /waba/events | Trigger WhatsApp Event |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"List all country?\" -> GET /analytics/country\n- \"List all date?\" -> GET /analytics/date\n- \"List all label?\" -> GET /analytics/label\n- \"List all subaccount?\" -> GET /analytics/subaccount\n- \"List all balance?\" -> GET /balance\n- \"List all contacts?\" -> GET /contacts\n- \"Create a contact?\" -> POST /contacts\n- \"Delete a contact?\" -> DELETE /contacts/{id}\n- \"Get contact details?\" -> GET /contacts/{id}\n- \"Partially update a contact?\" -> PATCH /contacts/{id}\n- \"List all groups?\" -> GET /groups\n- \"Create a group?\" -> POST /groups\n- \"Delete a group?\" -> DELETE /groups/{id}\n- \"Get group details?\" -> GET /groups/{id}\n- \"Partially update a group?\" -> PATCH /groups/{id}\n- \"List all hooks?\" -> GET /hooks\n- \"Create a hook?\" -> POST /hooks\n- \"List all outbound?\" -> GET /journal/outbound\n- \"List all inbound?\" -> GET /journal/inbound\n- \"List all replies?\" -> GET /journal/replies\n- \"List all voice?\" -> GET /journal/voice\n- \"List all cnam?\" -> GET /lookup/cnam\n- \"List all format?\" -> GET /lookup/format\n- \"List all hlr?\" -> GET /lookup/hlr\n- \"List all mnp?\" -> GET /lookup/mnp\n- \"List all rcs?\" -> GET /lookup/rcs\n- \"List all active?\" -> GET /numbers/active\n- \"Delete a active?\" -> DELETE /numbers/active/{number}\n- \"Get active details?\" -> GET /numbers/active/{number}\n- \"Partially update a active?\" -> PATCH /numbers/active/{number}\n- \"List all available?\" -> GET /numbers/available\n- \"Create a order?\" -> POST /numbers/order\n- \"List all pricing?\" -> GET /pricing\n- \"Create a event?\" -> POST /rcs/events\n- \"Create a message?\" -> POST /rcs/messages\n- \"Delete a message?\" -> DELETE /rcs/messages/{id}\n- \"Create a sm?\" -> POST /sms\n- \"List all status?\" -> GET /status\n- \"List all list?\" -> GET /subaccounts/list\n- \"Create a create?\" -> POST /subaccounts/create\n- \"Create a update?\" -> POST /subaccounts/update\n- \"Create a transfer_credit?\" -> POST /subaccounts/transfer_credits\n- \"Create a delete?\" -> POST /subaccounts/delete\n- \"Create a validate_for_voice?\" -> POST /validate_for_voice\n- \"Create a voice?\" -> POST /voice\n- \"Create a hangup?\" -> POST /voice/{call_id}/hangup\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 seven\n@base https://gateway.seven.io/api\n@version 1.0.0\n@auth OAuth2\n@endpoints 51\n@hint download_for_search\n@toc analytics(4), balance(1), contacts(5), groups(5), hooks(3), journal(4), lookup(5), numbers(6), pricing(1), rcs(3), sms(2), status(1), subaccounts(5), validate_for_voice(1), voice(2), waba(3)\n\n@group analytics\n@endpoint GET /analytics/country\n@desc Get Analytics By Country\n@optional {end: str # End date of the statistics. Defaults to the current day., label: str # Shows only data of a specific label., start: str # Start date of the statistics in the format YYYY-MM-DD. By default, the date of 30 days ago is set., subaccounts: str # Receive the data only for the main account, all your (sub-)accounts or only for specific subaccounts.}\n@returns(200) OK\n\n@endpoint GET /analytics/date\n@desc Get Analytics By Date\n@optional {end: str # End date of the statistics. Defaults to the current day., label: str # Shows only data of a specific label., start: str # Start date of the statistics in the format YYYY-MM-DD. By default, the date of 30 days ago is set., subaccounts: str # Receive the data only for the main account, all your (sub-)accounts or only for specific subaccounts.}\n@returns(200) OK\n\n@endpoint GET /analytics/label\n@desc Get Analytics By Label\n@optional {end: str # End date of the statistics. Defaults to the current day., label: str # Shows only data of a specific label., start: str # Start date of the statistics in the format YYYY-MM-DD. By default, the date of 30 days ago is set., subaccounts: str # Receive the data only for the main account, all your (sub-)accounts or only for specific subaccounts.}\n@returns(200) OK\n\n@endpoint GET /analytics/subaccount\n@desc Get Analytics By Label\n@optional {end: str # End date of the statistics. Defaults to the current day., label: str # Shows only data of a specific label., start: str # Start date of the statistics in the format YYYY-MM-DD. By default, the date of 30 days ago is set., subaccounts: str # Receive the data only for the main account, all your (sub-)accounts or only for specific subaccounts.}\n@returns(200) OK\n\n@endgroup\n\n@group balance\n@endpoint GET /balance\n@desc Get Balance\n@returns(200) {amount: num(float), currency: str} # OK\n\n@endgroup\n\n@group contacts\n@endpoint GET /contacts\n@desc List Contacts\n@returns(200) {data: [map], pagingMetadata: map{offset: int, count: int, total: int, limit: int, has_more: bool}} # OK\n\n@endpoint POST /contacts\n@desc Create Contact\n@returns(200) {id: int(int32), avatar: str, validation: map{state: str, timestamp: str}, initials: map{initials: str, color: str}, properties: map{firstname: str, lastname: str, mobile_number: int(int64), home_number: str, email: str, address: str, postal_code: str, city: str, birthday: str(date), notes: str}, groups: [int], created: str} # OK\n\n@endpoint DELETE /contacts/{id}\n@desc Delete Contact\n@required {id: str # The ID of the contact for deletion.}\n@returns(200) {error: str, success: bool} # OK\n\n@endpoint GET /contacts/{id}\n@desc Get Contact\n@required {id: str # The ID of the contact for retrieval.}\n@returns(200) {id: int(int32), avatar: str, validation: map{state: str, timestamp: str}, initials: map{initials: str, color: str}, properties: map{firstname: str, lastname: str, mobile_number: int(int64), home_number: str, email: str, address: str, postal_code: str, city: str, birthday: str(date), notes: str}, groups: [int], created: str} # OK\n\n@endpoint PATCH /contacts/{id}\n@desc Update Contact\n@required {id: str # The ID of the contact for deletion.}\n@returns(200) {id: int(int32), avatar: str, validation: map{state: str, timestamp: str}, initials: map{initials: str, color: str}, properties: map{firstname: str, lastname: str, mobile_number: int(int64), home_number: str, email: str, address: str, postal_code: str, city: str, birthday: str(date), notes: str}, groups: [int], created: str} # OK\n\n@endgroup\n\n@group groups\n@endpoint GET /groups\n@desc List Groups\n@returns(200) {data: [map], pagingMetadata: map{offset: int, count: int, total: int, limit: int, has_more: bool}} # OK\n\n@endpoint POST /groups\n@desc Create Group\n@returns(200) {id: int, name: str, members_count: int, has_more: bool} # OK\n\n@endpoint DELETE /groups/{id}\n@desc Delete Group\n@required {id: str # The ID of the group for deletion.}\n@returns(200) {success: bool} # OK\n\n@endpoint GET /groups/{id}\n@desc Get Group\n@required {id: int # The ID of the group for retrieval.}\n@returns(200) {id: int, name: str, members_count: int, has_more: bool} # OK\n\n@endpoint PATCH /groups/{id}\n@desc Update Group\n@required {id: int # The ID of the group for updating.}\n@returns(200) {id: int, name: str, members_count: int, has_more: bool} # OK\n\n@endgroup\n\n@group hooks\n@endpoint DELETE /hooks\n@desc Delete Hook\n@returns(200) {code: str, error_message: str, id: int, success: bool} # OK\n\n@endpoint GET /hooks\n@desc List Hooks\n@returns(200) {data: [map]} # OK\n\n@endpoint POST /hooks\n@desc Create Hook\n@returns(200) {code: str, error_message: str, id: int, success: bool} # OK\n\n@endgroup\n\n@group journal\n@endpoint GET /journal/outbound\n@desc Get outbound messages\n@optional {id: int # The ID of a message, date_from: str # A start date from which the search should start, date_to: str # An end date up to which the search is to be performed, to: str # The receivers phone number in any format., state: str # The status of the message. - could be e.g. completed / failed for Voice or DELIVERED / NOTDELIVERED etc. for SMS, limit: int # Limits the number of entries to be returned., offset: int # Starting point from which entries are to be queried.}\n@returns(200) OK\n\n@endpoint GET /journal/inbound\n@desc Get inbound messages\n@optional {id: int # The ID of a message, date_from: str # A start date from which the search should start, date_to: str # An end date up to which the search is to be performed, to: str # The receivers phone number in any format., state: str # The status of the message. - could be e.g. completed / failed for Voice or DELIVERED / NOTDELIVERED etc. for SMS, limit: int # Limits the number of entries to be returned., offset: int # Starting point from which entries are to be queried.}\n@returns(200) OK\n\n@endpoint GET /journal/replies\n@desc Get message replies\n@optional {id: int # The ID of a message, date_from: str # A start date from which the search should start, date_to: str # An end date up to which the search is to be performed, to: str # The receivers phone number in any format., state: str # The status of the message. - could be e.g. completed / failed for Voice or DELIVERED / NOTDELIVERED etc. for SMS, limit: int # Limits the number of entries to be returned., offset: int # Starting point from which entries are to be queried.}\n@returns(200) OK\n\n@endpoint GET /journal/voice\n@desc Get voice journal\n@optional {id: int # The ID of a message, date_from: str # A start date from which the search should start, date_to: str # An end date up to which the search is to be performed, to: str # The receivers phone number in any format., state: str # The status of the message. - could be e.g. completed / failed for Voice or DELIVERED / NOTDELIVERED etc. for SMS, limit: int # Limits the number of entries to be returned., offset: int # Starting point from which entries are to be queried.}\n@returns(200) OK\n\n@endgroup\n\n@group lookup\n@endpoint GET /lookup/cnam\n@desc Lookup Caller Name\n@required {number: str # The phone number to look up}\n@returns(200) {code: num, success: str, name: str, number: str} # OK\n\n@endpoint GET /lookup/format\n@desc Lookup Format\n@required {number: str # The phone number to look up}\n@returns(200) {success: bool, international: str, international_formatted: str, national: str, country_iso: str, country_name: str, country_code: str} # OK\n\n@endpoint GET /lookup/hlr\n@desc Lookup HLR\n@required {number: str # The phone number to look up}\n@returns(200) {international_formatted: str, country_name: str, country_code: str, international_format_number: str, national_format_number: str, country_prefix: str, current_carrier: map{network_code: str, name: str, country: str, network_type: str}, original_carrier: map{network_code: str, name: str, country: str, network_type: str}, lookup_outcome: str, lookup_outcome_message: str, valid_number: str, reachable: str, roaming: map{status: str, roaming_country_code: str, roaming_network_code: str, roaming_network_name: str}} # OK\n\n@endpoint GET /lookup/mnp\n@desc Lookup MNP\n@required {number: str # The phone number to look up}\n@returns(200) {code: num, success: bool, price: num(float), mnp: map{country: str, number: str, national_format: str, international_formatted: str, network: str, mccmnc: str, isPorted: bool, network_type: str}} # OK\n\n@endpoint GET /lookup/rcs\n@desc Lookup RCS Capabilities\n@required {number: str # The phone number to look up}\n@returns(200) OK\n\n@endgroup\n\n@group numbers\n@endpoint GET /numbers/active\n@desc List Active Numbers\n@returns(200) {activeNumbers: [map]} # OK\n\n@endpoint DELETE /numbers/active/{number}\n@desc Delete Number\n@required {number: str # The phone number to delete.}\n@returns(200) {success: bool} # OK\n\n@endpoint GET /numbers/active/{number}\n@desc Get Number\n@required {number: str # The phone number to retrieve.}\n@returns(200) {country: str, number: str, friendly_name: str, billing: map{fees: map{setup: num, basic_charge: num, sms_mo: int(int32), voice_mo: int(int32)}, payment_interval: str}, features: map{sms: bool, a2p_sms: bool, voice: bool}, forward_sms_mo: map{sms: map{number: str, enabled: bool}, email: map{address: [str], enabled: bool}, slack: map{uri: str, enabled: bool}}, expires: str, created: str} # OK\n\n@endpoint PATCH /numbers/active/{number}\n@desc Update Number\n@required {number: str # The phone number to update details for.}\n@returns(200) {country: str, number: str, friendly_name: str, billing: map{fees: map{setup: num, basic_charge: num, sms_mo: int(int32), voice_mo: int(int32)}, payment_interval: str}, features: map{sms: bool, a2p_sms: bool, voice: bool}, forward_sms_mo: map{sms: map{number: str, enabled: bool}, email: map{address: [str], enabled: bool}, slack: map{uri: str, enabled: bool}}, expires: str, created: str} # OK\n\n@endpoint GET /numbers/available\n@desc Get Available Numbers\n@optional {country: str # The ISO 3166-1 alpha-2 country code of the country to search for available numbers in., features_sms: bool # If set to true, only numbers that support SMS will be returned., features_a2p_sms: bool # If set to true, only numbers that support A2P SMS will be returned., features_voice: bool # If set to true, only numbers that support voice will be returned.}\n@returns(200) {availableNumbers: [map]} # OK\n\n@endpoint POST /numbers/order\n@desc Order Number\n@returns(200) {error: str, success: bool} # OK\n\n@endgroup\n\n@group pricing\n@endpoint GET /pricing\n@desc Get Pricing\n@optional {country: str # The countries ISO code to get pricing for. Example values are \"de\" for Germany or \"fr\" for France. Omit to show pricing for all channels.}\n@returns(200) {countCountries: int, countNetworks: int, countries: [map]} # OK\n\n@endgroup\n\n@group rcs\n@endpoint POST /rcs/events\n@desc Trigger RCS Event\n@returns(200) {success: bool} # OK\n\n@endpoint POST /rcs/messages\n@desc Send RCS\n@returns(200) {balance: num, debug: str, messages: [map], sms_type: str, success: str, total_price: num} # Success\n\n@endpoint DELETE /rcs/messages/{id}\n@desc Delete RCS\n@required {id: str # The message ID for deletion}\n@returns(200) {success: bool} # OK\n\n@endgroup\n\n@group sms\n@endpoint DELETE /sms\n@desc Delete Sms\n@returns(200) {deleted: [int], success: bool} # Success\n\n@endpoint POST /sms\n@desc Send Sms\n@returns(200) {balance: num, debug: str, messages: [map], sms_type: str, success: str, total_price: num} # Success\n\n@endgroup\n\n@group status\n@endpoint GET /status\n@desc Get SMS Status\n@required {msg_id: str # A comma separated list of SMS IDs to check}\n@returns(200) Success\n\n@endgroup\n\n@group subaccounts\n@endpoint GET /subaccounts/list\n@desc List Subaccounts\n@optional {id: str # The ID of a subaccount. This will give you only the data for a specific subaccount.}\n@returns(200) OK\n\n@endpoint POST /subaccounts/create\n@desc Create Subaccount\n@returns(200) {error: str, subaccount: map{id: str, username: str, company: str, balance: str, total_usage: str, auto_topup: map{amount: str, threshold: str}, contact: map{email: str, name: str}}, success: bool} # OK\n\n@endpoint POST /subaccounts/update\n@desc Automatic Balance Transfer\n@returns(200) {error: str, success: bool} # OK\n\n@endpoint POST /subaccounts/transfer_credits\n@desc Manual Credit Transfer\n@returns(200) {error: str, success: bool} # OK\n\n@endpoint POST /subaccounts/delete\n@desc Delete Subaccount\n@returns(200) {error: str, success: bool} # OK\n\n@endgroup\n\n@group validate_for_voice\n@endpoint POST /validate_for_voice\n@desc Validate Caller ID for Voice\n@returns(200) Success\n\n@endgroup\n\n@group voice\n@endpoint POST /voice\n@desc Send text-to-speech Voice Call\n@returns(200) Success\n\n@endpoint POST /voice/{call_id}/hangup\n@desc End Voice Call\n@required {call_id: str # The ID of the call to be ended}\n@returns(200) {error: str, success: bool} # Success\n\n@endgroup\n\n@group waba\n@endpoint POST /waba/messages\n@desc Send WhatsApp Message\n@required {from: str # The WhatsApp sender number., to: str # The recipient phone number.}\n@optional {type: str(template/text/image/video/audio/document/sticker/location/contacts/interactive) # The message type. Required for structured messages. Omit for simple freetext messages using the \"text\" parameter., template: str # The template name. Required when type is \"template\"., language: str # The language code for the template (e.g. \"de\", \"en\"). Required when type is \"template\"., text: str # The free text message content. Used for non-template messages within an active conversation., delay: str # Date/Time for delayed dispatch - expects a date time like \"2026-02-10 09:00:00\" or a Unix timestamp., label: str # A custom label for sorting analytics., foreign_id: str # Identifier to return in callbacks for status reports etc., ttl: int # Time to live in minutes for the message., performance_tracking: bool=false # Enable performance tracking for found URLs., components: map{header: [str], body: [str], buttons: [map]} # Template components for parameter substitution. Values are positional and replace {{1}}, {{2}}, etc. in the template., url: str # Public URL of the media file. Required for image, video, audio, document, and sticker types., caption: str # Caption for the media file. Optional for image, video, and document types., filename: str # Filename for the document. Required when type is \"document\"., latitude: num(double) # Latitude of the location. Required when type is \"location\"., longitude: num(double) # Longitude of the location. Required when type is \"location\"., name: str # Name of the location. Optional when type is \"location\"., address: str # Address of the location. Optional when type is \"location\"., contacts: [map{name!: map, phones!: [map]}] # Contact cards to send. Required when type is \"contacts\"., interactive_type: str(button/list) # Sub-type for interactive messages. Required when type is \"interactive\"., body: str # Body text for interactive messages., header: str # Header text for interactive messages., footer: str # Footer text for interactive messages., buttons: [map{id!: str, title!: str}] # Buttons for interactive button messages. Max 3 buttons., button_text: str # Button text for interactive list messages., sections: [map{title!: str, rows!: [map]}] # Sections for interactive list messages.}\n@returns(200) {success: str, total_price: num, balance: num, debug: str, sms_type: str, messages: [map]} # OK\n@errors {400: Bad Request}\n\n@endpoint DELETE /waba/messages/{id}\n@desc Delete WhatsApp Message\n@required {id: str # The ID of the message to delete.}\n@returns(200) {success: bool} # OK\n@errors {400: Bad Request, 404: Not Found}\n\n@endpoint POST /waba/events\n@desc Trigger WhatsApp Event\n@required {event: str(read/is_typing/reaction) # The event type to trigger.}\n@optional {from: str # The WhatsApp sender number. Not used for reaction events., to: str # The recipient phone number. Not used for reaction events. At least one of \"to\" or \"msg_id\" must be provided., msg_id: str # The ID of the message to which the event refers. At least one of \"to\" or \"msg_id\" must be provided., message_id: str # The ID of the message to react to. Required when event is \"reaction\"., emoji: str # Emoji for the reaction. Required when event is \"reaction\".}\n@returns(200) {success: bool} # OK\n@errors {400: Bad Request}\n\n@endgroup\n\n@end\n"}}