{"_id":"56b136c636d2580d002478d2","category":{"_id":"56acd8f95ac4060d0027865e","__v":7,"project":"56acd71213ac890d001c3c7a","version":"56acd71213ac890d001c3c7d","pages":["56ad4897c00d120d00744350","56afce739d32e30d0006d3b5","56afd4573a5b810d00745d77","56afd5049d32e30d0006d3bf","56afdc7d9d32e30d0006d3c5","56afdda49d32e30d0006d3c8","56b136c636d2580d002478d2"],"sync":{"url":"","isSync":false},"reference":false,"createdAt":"2016-01-30T15:38:33.013Z","from_sync":false,"order":2,"slug":"restful-api","title":"REST API"},"version":{"_id":"56acd71213ac890d001c3c7d","project":"56acd71213ac890d001c3c7a","__v":15,"createdAt":"2016-01-30T15:30:26.928Z","releaseDate":"2016-01-30T15:30:26.928Z","categories":["56acd71313ac890d001c3c7e","56acd8f113ac890d001c3c81","56acd8f95ac4060d0027865e","56acd93a13ac890d001c3c82","56ad20660ab3c00d00ce3347","56ad356a2a7860170013f714","56ad47eb0ab3c00d00ce334f","56afd523bc304a0d00ace1df","56b29a019621f20d00efb37e","56b657e11bc6970d009feee7","5845cc3c39950c1b002afe77","5845cde163c11b250037967e","5846efd45d064323007b17b4","588604da4674e32300efd160","588627882393d50f00f1322c"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":true,"codename":"","version_clean":"1.0.0","version":"1.0"},"user":"56acd6caa040860d00ac94a2","project":"56acd71213ac890d001c3c7a","__v":6,"githubsync":"","parentDoc":null,"updates":[],"next":{"pages":[],"description":""},"createdAt":"2016-02-02T23:07:50.210Z","link_external":false,"link_url":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":3,"body":"[block:callout]\n{\n  \"type\": \"info\",\n  \"title\": \"Benefit Delivery is Complicated\",\n  \"body\": \"This is dense material, but is required reading if you're wanting to work with subscriber benefits at all in your application\"\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Benefit Basics\"\n}\n[/block]\nBenefits and their fulfillment are basically the core of GameWisp. As such, benefits are also the most complicated concept to describe. \n\nWhen a user subscribes to a channel's tier, they're awarded at least one (but usually several) benefits in exchange for their subscription. These benefits are fulfilled in a myriad of different ways:\n\n* **Implicitly by the platform** -- For example, you have to be a subscriber with the Early Access Video benefit and specifically be on the GameWisp site to watch early access videos. The Exclusive Video and Subscriber Messaging benefits are also fulfilled natively through functionality directly on the GameWisp platform. \n* **Automatically** -- GameWisp fulfills some benefits automatically. If the benefit can be accomplished by e-mailing all the subscribers that have a particular benefit the exact same information, then it is fulfilled automatically without the channel needing to do anything.\n* **Manually by the channel** -- The channel can fulfill benefits manually. This usually occurs when a channel has to send different information to each subscriber for a benefit (e.g., custom thank you messages, etc.)\n* **Manually after user input** -- The channel can fulfill benefits manually, but sometimes need to wait for specific information from the subscriber (e.g., mailing addresses, twitter soutouts that require the subscribers :::at:::handle, etc.)\n\nRegardless of the benefit, whenever it is fulfilled, it is done so using a ```fulfillment``` object on the back end. This object links a benefit to whatever action the channel performed to fulfill the benefit. \n\nWhen you receive benefits and their fulfillment information through Singularity or the REST API, it comes in the form of a **benefit-fulfillment pair**. The benefit-fulfillment pair is used to fully describe the benefit and whatever the channel did to fulfill it. \n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"The Benefit-Fulfillment Pair\"\n}\n[/block]\nAn example benefit-fulfillment pair is shown below. Note that the ```fulfillment``` object's **benefit_id** property matches the **id** property of the ```benefit``` object:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \" {\\n            benefit: {\\n               id: \\\"3\\\",\\n               delivery: \\\"delivery-messaging\\\",\\n               title: \\\"Subscriber Messaging\\\",\\n               description: \\\"Receive Subscriber-only messages from me.\\\",\\n               channel_data: null,\\n               type: \\\"unknown-type\\\",\\n               month_delay: null,\\n               recurring: false,\\n               recurring_input: false,\\n               receieve_immediately: false,\\n               removed_at: null,\\n               subscriber_limit: null,\\n               tier_bonus: false,\\n               quantity: 1,\\n               multiplier: 1\\n            },\\n            fulfillment: {\\n               id: \\\"54350\\\",\\n               benefit_id: \\\"3\\\",\\n               tier_id: \\\"8781\\\",\\n               channel_fulfillment_response: null,\\n               fulfilled_at: \\\"2015-12-30 21:29:07\\\",\\n               previously_fulfilled_at: null,\\n               disabled_at: null,\\n               user_input: null,\\n               user_input_provided_at: null,\\n               recurring: true,\\n               granted_at: {\\n                  date: \\\"2015-12-30 21:29:07.000000\\\",\\n                  timezone_type: 3,\\n                  timezone: \\\"UTC\\\"\\n               },\\n               channel_cancelled_at: null,\\n               status: \\\"active\\\"\\n            }\\n         }\",\n      \"language\": \"json\"\n    }\n  ]\n}\n[/block]\nThere's a lot to parse here. The following table breaks down the ```benefit``` object:\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Parameter\",\n    \"h-1\": \"Type\",\n    \"h-2\": \"Description\",\n    \"0-0\": \"id\",\n    \"0-1\": \"Integer\",\n    \"1-0\": \"delivery\",\n    \"1-1\": \"String\",\n    \"2-0\": \"title\",\n    \"2-1\": \"String\",\n    \"3-0\": \"description\",\n    \"3-1\": \"String\",\n    \"4-0\": \"type\",\n    \"4-1\": \"String\",\n    \"5-0\": \"month_delay\",\n    \"5-1\": \"Integer\",\n    \"6-0\": \"recurring\",\n    \"6-1\": \"Boolean\",\n    \"7-0\": \"recurring_input\",\n    \"7-1\": \"Boolean\",\n    \"8-0\": \"receieve_immediately\",\n    \"8-1\": \"Boolean\",\n    \"9-0\": \"removed_at\",\n    \"9-1\": \"String formatted UTC DateTime\",\n    \"10-0\": \"subscriber_limit\",\n    \"10-1\": \"Integer\",\n    \"11-0\": \"tier_bonus\",\n    \"11-1\": \"Boolean\",\n    \"12-0\": \"quantity\",\n    \"12-1\": \"Integer\",\n    \"13-0\": \"multiplier\",\n    \"13-1\": \"Integer\",\n    \"0-2\": \"The identifier for the benefit. Note that the “Premium Videos”, “Early Access Videos”, and “Subscriber Messaging” benefits will have the same identifier (1, 2, and 3 respectively) across GameWisp channels.\",\n    \"1-2\": \"The delivery type of the benefit. This parameter describes how the benefit is delivered by GameWisp. Options are:\\n\\n* **delivery-messaging** - Unique to the Subscriber Messaging benefit, indicates that the benefit allows the subscriber to access messaging features for the channel. \\n* **delivery-video** - Unique to the Early Access and Exclusive Video benefits. Indicates that the user can view early access and/or premium videos for the channel on GameWisp.\\n* **delivery-automatic** - Indicates that the benefit’s data is automatically sent to the subscriber upon subscription.\\n* **delivery-personal** - Indicates that the channel must do something specific to this subscriber in order to fulfill the benefit. For example, providing channel currency. This is likely the benefit delivery type of most importance for bots and other applications that generally want to automate some action for a specific user.\\n* **delivery-personal-input** - Indicates that the channel must do something specific to this subscriber, but some input is required by the subscriber. This input is collected on GameWisp, typically after this event has been sent.\\n* **delivery-none** - Nothing is required to be sent to a subscriber, but something is required to be performed by the channel. Examples include giveaways and playing games with subscribers.\\n* **delivery-unknown** - Error condition. The delivery type isn’t recognized by Singularity.\",\n    \"2-2\": \"The title of the benefit\",\n    \"3-2\": \"The benefit's description.\",\n    \"4-2\": \"The type of the benefit. Can be one of several options. They are as follows:\\n\\n* **currency-more** - More channel currency to the subscriber.\\n* **currency-multiplier** - Multiplier for the amount of currency earned.\\n* **access-server** - Server credentials for games, etc.\\n* **access-teamspeak** - Credentials to access a teamspeak server.\\n* **access-discord** - Access information for a Discord server.\\n* **giveaways** - Access to giveaways performed by the channel.\\n* **play-games** - Access to game playing sessions.\\n* **subscriber-art** - Access to art delivered by the channel.\\n* **subscriber-music** - Access to music delivered by the channel.\\n* **giftcards** - Giftcards for Steam, Origin, etc.\\n* **videos-exclusive **- Access to videos hosted only on GameWisp.\\n* **videos-early** - Access to videos hosted on GameWisp in their early access period.\\n* **custom** - A benefit created custom by the channel.\\n* **unknown-type** - Error condition. The benefit type isn’t recognized by Singularity.\",\n    \"5-2\": \"The number of months that a benefit should be delayed before it is awarded to the subscriber. This number is always an integer between 1 and 12. It is null if no delay has been specified.\",\n    \"6-2\": \"Specifies whether or not a benefit recurs. If this is true and a **month_delay** is specified, the benefit should recur every X months as specified by **month_delay**.\",\n    \"7-2\": \"Specifies whether or not new input is required from the user each time the benefit recurs. This is only true if the **delivery_type** is also **delivery-personal-input**, but can also be false in this case.\",\n    \"8-2\": \"Indicates that the user should receive the benefit immediately. This value will only ever be true if** month_delay** is not null, and can still be false in this case. Otherwise, there is no delay on benefit delivery and the benefit will be delivered immediately regardless of the value for **receieve_immediately**.\",\n    \"9-2\": \"Indicates that this benefit has been removed from a tier. Subscribers may still have this benefit if they subscribed while the benefit was part of a tier.\",\n    \"10-2\": \"If not null, indicates the maximum number of subscribers that can have this benefit at any one time.\",\n    \"11-2\": \"Indicates that this benefit is a tier bonus. As such it does not stack with higher tiers. The **currency-more** and **currency-multiplier** benefits are typically tier bonuses.\",\n    \"12-2\": \"The amount of the benefit. Default is 1. This field is currently only relevant for benefits of the type **currency-more**, but may be expanded to other benefit types in the future.\",\n    \"13-2\": \"A multiplier on the benefit. Default is 1. This field is currently only relevant for benefits of the **currency-multiplier** type, but may be expanded to other benefit types in the future.\"\n  },\n  \"cols\": 3,\n  \"rows\": 14\n}\n[/block]\nThe ```fulfillment``` object represents how the benefit is fulfilled by the channel. It is described as follows:\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"fulfillment: {\\n               id: \\\"54350\\\",\\n               benefit_id: \\\"3\\\",\\n               tier_id: \\\"8781\\\",\\n               channel_fulfillment_response: null,\\n               fulfilled_at: \\\"2015-12-30 21:29:07\\\",\\n               previously_fulfilled_at: null,\\n               disabled_at: null,\\n               user_input_provided_at: null,\\n               recurring: true,\\n               granted_at: \\\"2015-12-30 21:29:07.000000\\\",\\n               channel_cancelled_at: null,\\n               status: \\\"active\\\",\\n\\t\\t\\t\\t\\t\\t\\t user_input: null,\\n            }\",\n      \"language\": \"json\"\n    }\n  ]\n}\n[/block]\n\n[block:callout]\n{\n  \"type\": \"warning\",\n  \"title\": \"user_input is only Accessible through the Subscriber Resource\",\n  \"body\": \"access user_input requires the 'subscriber_read_full' scope, and is only accessible from the Subscriber Resource (e.g., the /subscriber/subscriptions endpoint)\"\n}\n[/block]\n\n[block:parameters]\n{\n  \"data\": {\n    \"h-0\": \"Parameter\",\n    \"h-1\": \"Type\",\n    \"h-2\": \"Description\",\n    \"0-0\": \"id\",\n    \"0-1\": \"Integer\",\n    \"1-0\": \"benefit_id\",\n    \"1-1\": \"Integer\",\n    \"2-0\": \"tier_id\",\n    \"2-1\": \"Integer\",\n    \"3-0\": \"channel_fulfillment_response\",\n    \"3-1\": \"String\",\n    \"4-0\": \"fulfilled_at\",\n    \"4-1\": \"String formatted UTC DateTime\",\n    \"5-1\": \"String formatted UTC DateTime\",\n    \"7-1\": \"String formatted UTC DateTime\",\n    \"8-1\": \"String formatted UTC DateTime\",\n    \"5-0\": \"previously_fulfilled_at\",\n    \"6-0\": \"recurring\",\n    \"6-1\": \"Boolean\",\n    \"7-0\": \"granted_at\",\n    \"8-0\": \"channel_cancelled_at\",\n    \"9-0\": \"status\",\n    \"9-1\": \"String\",\n    \"9-2\": \"The status of the fulfillment for the subscriber. Statuses are as follows:\\n\\n* **active** - The benefit fulfillment is currently active for the subscriber.\\n* **inactive** - The benefit fulfillment is inactive and the subscriber should no longer receive it.\\n* **delayed** - The subscriber has the benefit, but its fulfillment is currently delayed. This occurs most often with recurring / delayed benefits.\\n* **dismissed-channel **- The channel has dismissed this benefit for this subscriber.\\n* **dismissed-channel-email** - The channel has dismissed this benefit for this subscriber and notified the subscriber of doing so via email.\\n* ** dismissed-subscriber** - The subscriber dismissed the benefit. This usually occurs when the subscriber does not want a benefit being offered by the channel.\\n* **cancelled-action-required** - The benefit has been cancelled and the channel needs to take some action manually as a result. This action usually entails removing subscribers from third party services (e.g., game server whitelists, giveaway lists, etc.).\\n* **unknown-status** - Error condition.\",\n    \"0-2\": \"The unique identifier for the fulfillment object.\",\n    \"1-2\": \"The benefit identifier to which the fulfillment object belongs. In other words, a fulfillment object with **benefit_id** = 5 was used to fulfill the benefit with **id** = 5 for that particular channel.\",\n    \"2-2\": \"The unique identifier of the tier to which the fulfilled benefit belongs.\",\n    \"3-2\": \"If the channel provided a response when fulfilling the benefit, it is provided here.\",\n    \"4-2\": \"A timestamp indicating when the benefit was fulfilled. Null if the benefit has not yet been fulfilled.\",\n    \"5-2\": \"The date this benefit was last fulfilled by the channel. This is only non-null if the benefit is recurring and has been fulfilled previously.\",\n    \"6-2\": \"True if the fulfillment object is for a recurring benefit, false otherwise.\",\n    \"7-2\": \"The time that the benefit was awarded to the subscriber.\",\n    \"8-2\": \"The time that the channel cancelled this benefit for the subscriber. Only non-null if the benefit has been cancelled.\",\n    \"10-0\": \"user_input\",\n    \"10-1\": \"String\",\n    \"10-2\": \"If the user has provided any input that is needed to fulfill this benefit, it will be included here. \\n\\n**Only visible for access tokens with the subscriber_read_full scope.***\"\n  },\n  \"cols\": 3,\n  \"rows\": 11\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Fulfilling Benefits\"\n}\n[/block]\nRemember, currently the REST API and Singularity are **read only**. So if you want to fulfill a benefit on behalf of a channel, you cannot currently signal to GameWisp that your application has fulfilled that benefit. \n\nIt's highly anticipated that this functionality will be incorporated into the API and Singularity in the future, so if you need it, please let us know!","excerpt":"Required reading if you're interested in writing applications that can help channels fulfill subscriber rewards","slug":"working-with-benefits-and-fulfillment","type":"basic","title":"Working with Benefits and Fulfillment"}

Working with Benefits and Fulfillment

Required reading if you're interested in writing applications that can help channels fulfill subscriber rewards

[block:callout] { "type": "info", "title": "Benefit Delivery is Complicated", "body": "This is dense material, but is required reading if you're wanting to work with subscriber benefits at all in your application" } [/block] [block:api-header] { "type": "basic", "title": "Benefit Basics" } [/block] Benefits and their fulfillment are basically the core of GameWisp. As such, benefits are also the most complicated concept to describe. When a user subscribes to a channel's tier, they're awarded at least one (but usually several) benefits in exchange for their subscription. These benefits are fulfilled in a myriad of different ways: * **Implicitly by the platform** -- For example, you have to be a subscriber with the Early Access Video benefit and specifically be on the GameWisp site to watch early access videos. The Exclusive Video and Subscriber Messaging benefits are also fulfilled natively through functionality directly on the GameWisp platform. * **Automatically** -- GameWisp fulfills some benefits automatically. If the benefit can be accomplished by e-mailing all the subscribers that have a particular benefit the exact same information, then it is fulfilled automatically without the channel needing to do anything. * **Manually by the channel** -- The channel can fulfill benefits manually. This usually occurs when a channel has to send different information to each subscriber for a benefit (e.g., custom thank you messages, etc.) * **Manually after user input** -- The channel can fulfill benefits manually, but sometimes need to wait for specific information from the subscriber (e.g., mailing addresses, twitter soutouts that require the subscribers @handle, etc.) Regardless of the benefit, whenever it is fulfilled, it is done so using a ```fulfillment``` object on the back end. This object links a benefit to whatever action the channel performed to fulfill the benefit. When you receive benefits and their fulfillment information through Singularity or the REST API, it comes in the form of a **benefit-fulfillment pair**. The benefit-fulfillment pair is used to fully describe the benefit and whatever the channel did to fulfill it. [block:api-header] { "type": "basic", "title": "The Benefit-Fulfillment Pair" } [/block] An example benefit-fulfillment pair is shown below. Note that the ```fulfillment``` object's **benefit_id** property matches the **id** property of the ```benefit``` object: [block:code] { "codes": [ { "code": " {\n benefit: {\n id: \"3\",\n delivery: \"delivery-messaging\",\n title: \"Subscriber Messaging\",\n description: \"Receive Subscriber-only messages from me.\",\n channel_data: null,\n type: \"unknown-type\",\n month_delay: null,\n recurring: false,\n recurring_input: false,\n receieve_immediately: false,\n removed_at: null,\n subscriber_limit: null,\n tier_bonus: false,\n quantity: 1,\n multiplier: 1\n },\n fulfillment: {\n id: \"54350\",\n benefit_id: \"3\",\n tier_id: \"8781\",\n channel_fulfillment_response: null,\n fulfilled_at: \"2015-12-30 21:29:07\",\n previously_fulfilled_at: null,\n disabled_at: null,\n user_input: null,\n user_input_provided_at: null,\n recurring: true,\n granted_at: {\n date: \"2015-12-30 21:29:07.000000\",\n timezone_type: 3,\n timezone: \"UTC\"\n },\n channel_cancelled_at: null,\n status: \"active\"\n }\n }", "language": "json" } ] } [/block] There's a lot to parse here. The following table breaks down the ```benefit``` object: [block:parameters] { "data": { "h-0": "Parameter", "h-1": "Type", "h-2": "Description", "0-0": "id", "0-1": "Integer", "1-0": "delivery", "1-1": "String", "2-0": "title", "2-1": "String", "3-0": "description", "3-1": "String", "4-0": "type", "4-1": "String", "5-0": "month_delay", "5-1": "Integer", "6-0": "recurring", "6-1": "Boolean", "7-0": "recurring_input", "7-1": "Boolean", "8-0": "receieve_immediately", "8-1": "Boolean", "9-0": "removed_at", "9-1": "String formatted UTC DateTime", "10-0": "subscriber_limit", "10-1": "Integer", "11-0": "tier_bonus", "11-1": "Boolean", "12-0": "quantity", "12-1": "Integer", "13-0": "multiplier", "13-1": "Integer", "0-2": "The identifier for the benefit. Note that the “Premium Videos”, “Early Access Videos”, and “Subscriber Messaging” benefits will have the same identifier (1, 2, and 3 respectively) across GameWisp channels.", "1-2": "The delivery type of the benefit. This parameter describes how the benefit is delivered by GameWisp. Options are:\n\n* **delivery-messaging** - Unique to the Subscriber Messaging benefit, indicates that the benefit allows the subscriber to access messaging features for the channel. \n* **delivery-video** - Unique to the Early Access and Exclusive Video benefits. Indicates that the user can view early access and/or premium videos for the channel on GameWisp.\n* **delivery-automatic** - Indicates that the benefit’s data is automatically sent to the subscriber upon subscription.\n* **delivery-personal** - Indicates that the channel must do something specific to this subscriber in order to fulfill the benefit. For example, providing channel currency. This is likely the benefit delivery type of most importance for bots and other applications that generally want to automate some action for a specific user.\n* **delivery-personal-input** - Indicates that the channel must do something specific to this subscriber, but some input is required by the subscriber. This input is collected on GameWisp, typically after this event has been sent.\n* **delivery-none** - Nothing is required to be sent to a subscriber, but something is required to be performed by the channel. Examples include giveaways and playing games with subscribers.\n* **delivery-unknown** - Error condition. The delivery type isn’t recognized by Singularity.", "2-2": "The title of the benefit", "3-2": "The benefit's description.", "4-2": "The type of the benefit. Can be one of several options. They are as follows:\n\n* **currency-more** - More channel currency to the subscriber.\n* **currency-multiplier** - Multiplier for the amount of currency earned.\n* **access-server** - Server credentials for games, etc.\n* **access-teamspeak** - Credentials to access a teamspeak server.\n* **access-discord** - Access information for a Discord server.\n* **giveaways** - Access to giveaways performed by the channel.\n* **play-games** - Access to game playing sessions.\n* **subscriber-art** - Access to art delivered by the channel.\n* **subscriber-music** - Access to music delivered by the channel.\n* **giftcards** - Giftcards for Steam, Origin, etc.\n* **videos-exclusive **- Access to videos hosted only on GameWisp.\n* **videos-early** - Access to videos hosted on GameWisp in their early access period.\n* **custom** - A benefit created custom by the channel.\n* **unknown-type** - Error condition. The benefit type isn’t recognized by Singularity.", "5-2": "The number of months that a benefit should be delayed before it is awarded to the subscriber. This number is always an integer between 1 and 12. It is null if no delay has been specified.", "6-2": "Specifies whether or not a benefit recurs. If this is true and a **month_delay** is specified, the benefit should recur every X months as specified by **month_delay**.", "7-2": "Specifies whether or not new input is required from the user each time the benefit recurs. This is only true if the **delivery_type** is also **delivery-personal-input**, but can also be false in this case.", "8-2": "Indicates that the user should receive the benefit immediately. This value will only ever be true if** month_delay** is not null, and can still be false in this case. Otherwise, there is no delay on benefit delivery and the benefit will be delivered immediately regardless of the value for **receieve_immediately**.", "9-2": "Indicates that this benefit has been removed from a tier. Subscribers may still have this benefit if they subscribed while the benefit was part of a tier.", "10-2": "If not null, indicates the maximum number of subscribers that can have this benefit at any one time.", "11-2": "Indicates that this benefit is a tier bonus. As such it does not stack with higher tiers. The **currency-more** and **currency-multiplier** benefits are typically tier bonuses.", "12-2": "The amount of the benefit. Default is 1. This field is currently only relevant for benefits of the type **currency-more**, but may be expanded to other benefit types in the future.", "13-2": "A multiplier on the benefit. Default is 1. This field is currently only relevant for benefits of the **currency-multiplier** type, but may be expanded to other benefit types in the future." }, "cols": 3, "rows": 14 } [/block] The ```fulfillment``` object represents how the benefit is fulfilled by the channel. It is described as follows: [block:code] { "codes": [ { "code": "fulfillment: {\n id: \"54350\",\n benefit_id: \"3\",\n tier_id: \"8781\",\n channel_fulfillment_response: null,\n fulfilled_at: \"2015-12-30 21:29:07\",\n previously_fulfilled_at: null,\n disabled_at: null,\n user_input_provided_at: null,\n recurring: true,\n granted_at: \"2015-12-30 21:29:07.000000\",\n channel_cancelled_at: null,\n status: \"active\",\n\t\t\t\t\t\t\t user_input: null,\n }", "language": "json" } ] } [/block] [block:callout] { "type": "warning", "title": "user_input is only Accessible through the Subscriber Resource", "body": "access user_input requires the 'subscriber_read_full' scope, and is only accessible from the Subscriber Resource (e.g., the /subscriber/subscriptions endpoint)" } [/block] [block:parameters] { "data": { "h-0": "Parameter", "h-1": "Type", "h-2": "Description", "0-0": "id", "0-1": "Integer", "1-0": "benefit_id", "1-1": "Integer", "2-0": "tier_id", "2-1": "Integer", "3-0": "channel_fulfillment_response", "3-1": "String", "4-0": "fulfilled_at", "4-1": "String formatted UTC DateTime", "5-1": "String formatted UTC DateTime", "7-1": "String formatted UTC DateTime", "8-1": "String formatted UTC DateTime", "5-0": "previously_fulfilled_at", "6-0": "recurring", "6-1": "Boolean", "7-0": "granted_at", "8-0": "channel_cancelled_at", "9-0": "status", "9-1": "String", "9-2": "The status of the fulfillment for the subscriber. Statuses are as follows:\n\n* **active** - The benefit fulfillment is currently active for the subscriber.\n* **inactive** - The benefit fulfillment is inactive and the subscriber should no longer receive it.\n* **delayed** - The subscriber has the benefit, but its fulfillment is currently delayed. This occurs most often with recurring / delayed benefits.\n* **dismissed-channel **- The channel has dismissed this benefit for this subscriber.\n* **dismissed-channel-email** - The channel has dismissed this benefit for this subscriber and notified the subscriber of doing so via email.\n* ** dismissed-subscriber** - The subscriber dismissed the benefit. This usually occurs when the subscriber does not want a benefit being offered by the channel.\n* **cancelled-action-required** - The benefit has been cancelled and the channel needs to take some action manually as a result. This action usually entails removing subscribers from third party services (e.g., game server whitelists, giveaway lists, etc.).\n* **unknown-status** - Error condition.", "0-2": "The unique identifier for the fulfillment object.", "1-2": "The benefit identifier to which the fulfillment object belongs. In other words, a fulfillment object with **benefit_id** = 5 was used to fulfill the benefit with **id** = 5 for that particular channel.", "2-2": "The unique identifier of the tier to which the fulfilled benefit belongs.", "3-2": "If the channel provided a response when fulfilling the benefit, it is provided here.", "4-2": "A timestamp indicating when the benefit was fulfilled. Null if the benefit has not yet been fulfilled.", "5-2": "The date this benefit was last fulfilled by the channel. This is only non-null if the benefit is recurring and has been fulfilled previously.", "6-2": "True if the fulfillment object is for a recurring benefit, false otherwise.", "7-2": "The time that the benefit was awarded to the subscriber.", "8-2": "The time that the channel cancelled this benefit for the subscriber. Only non-null if the benefit has been cancelled.", "10-0": "user_input", "10-1": "String", "10-2": "If the user has provided any input that is needed to fulfill this benefit, it will be included here. \n\n**Only visible for access tokens with the subscriber_read_full scope.***" }, "cols": 3, "rows": 11 } [/block] [block:api-header] { "type": "basic", "title": "Fulfilling Benefits" } [/block] Remember, currently the REST API and Singularity are **read only**. So if you want to fulfill a benefit on behalf of a channel, you cannot currently signal to GameWisp that your application has fulfilled that benefit. It's highly anticipated that this functionality will be incorporated into the API and Singularity in the future, so if you need it, please let us know!