Approve a PENDING submission. For non-retainer campaigns, approval creates one CAMPAIGN_REWARD earning in READY_FOR_PAYMENT and queues the partner approval email. Requires write:affiliates. Foreign-team IDs return 404.The same operation is available through the affonso_approve_campaign_submission MCP tool.
Encoded submission id. No public REST endpoint, MCP tool, or webhook lists campaign submissions or returns their ids, so get it from the submission in Affonso. This endpoint returns it as id.
Reward amount. Required for custom and range campaigns. Minimum 0.01, maximum 999,999.99. The amount is not checked against the published reward_amount_min / reward_amount_max of a range campaign. Ignored for flat_rate (the campaign’s reward_amount is used) and retainer campaigns.
Only applies when this approval reaches the campaign’s max_budget and closes the campaign. When true, all PENDING applications are rejected. When omitted or false, they stay open.
Id of the earning created by this approval. null for retainer submissions, which create no earning, and for approvals made before earnings were created on approval.
When approval creates an earning, the partner approval email is queued in the same transaction. No email is queued when the campaign-submission-approvedemail notification is disabled, when the program has no portal settings, or when the affiliate has no valid email address. None of these affect earning creation.
If the approved amount brings the campaign’s approved reward spend to or above its owner max_budget, the approval still succeeds. A campaign with statusACTIVE or SCHEDULED is then moved to ENDED and campaign_closed_by_budget is true. Submissions of an ENDED campaign can still be approved.
Approving an already APPROVED submission is idempotent (HTTP 200). It returns the existing submission with its earning_id and earning_status, creates no new earning or email, and reports campaign_closed_by_budget as false and rejected_pending_applications as 0.
A REJECTED submission returns CONFLICT (HTTP 409). If a concurrent call reviews the submission first, the call may also return CONFLICT with “This submission was already reviewed”.
custom and range campaigns without an amount return VALIDATION_ERROR (HTTP 400) with fieldamount. An amount below 0.01 or above 999,999.99 fails body validation and returns VALIDATION_ERROR (HTTP 400) with details, before the submission is claimed, so no earning is created.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Affonso Docs","colors":{"primary":"#881337","light":"#881337","dark":"#881337"},"logo":{"light":"https://mintcdn.com/affonso-20c7dee8/nWO6r2CUpJ-o-z8l/logo/affonso_logo_small.png?fit=max\u0026auto=format\u0026n=nWO6r2CUpJ-o-z8l\u0026q=85\u0026s=4b239574262c42f95697481e8b29adce","dark":"https://mintcdn.com/affonso-20c7dee8/nWO6r2CUpJ-o-z8l/logo/affonso_logo_small.png?fit=max\u0026auto=format\u0026n=nWO6r2CUpJ-o-z8l\u0026q=85\u0026s=4b239574262c42f95697481e8b29adce"},"favicon":"https://mintcdn.com/affonso-20c7dee8/kkGMCXH0kqsXT8_K/favicon.ico?fit=max\u0026auto=format\u0026n=kkGMCXH0kqsXT8_K\u0026q=85\u0026s=fd253ea2af2c3136159ed21ad7b444e3","api":{"playground":{"display":"interactive"},"mdx":{"auth":{"method":"bearer"}}},"navbar":{"links":[{"href":"mailto:hello@affonso.io","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://affonso.io/app"}},"footer":{"socials":{"x":"https://x.com/useAffonso","linkedin":"https://www.linkedin.com/company/affiliate-software"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Home","icon":"home","href":"https://affonso.io"},{"anchor":"Blog","icon":"newspaper","href":"https://affonso.io/blog"},{"anchor":"Help Center","icon":"book-open-cover","href":"https://affonso.io/help"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"affonso-20c7dee8","hasAudioNarration":false,"actualSubdomain":"affonso-20c7dee8","customDomains":["docs.affonso.io"],"gitSource":{"type":"github","owner":"affonso-io","repo":"affonso-developer-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad9cb198f23b9083221d6ec","collectionId":"5bd7c50f-6faf-4c82-a257-1b96529f31a3","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad9cb198f23b9083221d6ec"},"feedback":{"thumbs":true,"edits":true,"issues":true},"entitlements":{},"buildId":"6adf30b36c71dd37a9879b40","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API Reference","count":103},{"language":"default","tag":"Program Management","count":48},{"language":"default","tag":"Core Resources","count":43},{"language":"default","tag":"Program Settings","count":33},{"language":"default","tag":"MCP","count":17},{"language":"default","tag":"Webhooks","count":11},{"language":"default","tag":"Campaigns","count":9},{"language":"default","tag":"Tools","count":9},{"language":"default","tag":"Getting Started","count":8},{"language":"default","tag":"Affiliates","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api/endpoint/campaigns/approve-submission","slug":"/api/endpoint/campaigns/approve-submission","pageMetadata":{"title":"Approve Campaign Submission","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/submissions/{submissionId}/approve","description":"Approve a pending campaign submission and create its earning","href":"/api/endpoint/campaigns/approve-submission"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Approve a pending campaign submission and create its earning\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Expandable,Heading,ParamField,ResponseField}=_components;if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Approve a `,_jsx(_components.code,{children:`PENDING`}),` submission. For non-retainer campaigns, approval creates one `,_jsx(_components.code,{children:`CAMPAIGN_REWARD`}),` earning in `,_jsx(_components.code,{children:`READY_FOR_PAYMENT`}),` and queues the partner approval email. Requires `,_jsx(_components.code,{children:`write:affiliates`}),`. Foreign-team IDs return 404.`]}),`\n`,_jsxs(_components.p,{children:[`The same operation is available through the `,_jsx(_components.a,{href:`/mcp/tools/campaigns`,children:_jsx(_components.code,{children:`affonso_approve_campaign_submission`})}),` MCP tool.`]}),`\n`,_jsx(Heading,{level:`2`,id:`path-parameters`,children:`Path Parameters`}),`\n`,_jsx(ParamField,{path:`id`,type:`string`,required:true,id:`param-id`,children:_jsx(_components.p,{children:`Encoded campaign id`})}),`\n`,_jsx(ParamField,{path:`submissionId`,type:`string`,required:true,id:`param-submission-id`,children:_jsxs(_components.p,{children:[`Encoded submission id. No public REST endpoint, MCP tool, or webhook lists campaign submissions or returns their ids, so get it from the submission in Affonso. This endpoint returns it as `,_jsx(_components.code,{children:`id`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`body-parameters`,children:`Body Parameters`}),`\n`,_jsx(_components.p,{children:`The body is optional. Unknown body fields are rejected.`}),`\n`,_jsx(ParamField,{body:`amount`,type:`number`,id:`param-amount`,children:_jsxs(_components.p,{children:[`Reward amount. Required for `,_jsx(_components.code,{children:`custom`}),` and `,_jsx(_components.code,{children:`range`}),` campaigns. Minimum 0.01, maximum 999,999.99. The amount is not checked against the published `,_jsx(_components.code,{children:`reward_amount_min`}),` / `,_jsx(_components.code,{children:`reward_amount_max`}),` of a `,_jsx(_components.code,{children:`range`}),` campaign. Ignored for `,_jsx(_components.code,{children:`flat_rate`}),` (the campaign’s `,_jsx(_components.code,{children:`reward_amount`}),` is used) and `,_jsx(_components.code,{children:`retainer`}),` campaigns.`]})}),`\n`,_jsx(ParamField,{body:`reject_open_applications`,type:`boolean`,id:`param-reject-open-applications`,children:_jsxs(_components.p,{children:[`Only applies when this approval reaches the campaign’s `,_jsx(_components.code,{children:`max_budget`}),` and closes the campaign. When `,_jsx(_components.code,{children:`true`}),`, all `,_jsx(_components.code,{children:`PENDING`}),` applications are rejected. When omitted or `,_jsx(_components.code,{children:`false`}),`, they stay open.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`response`,children:`Response`}),`\n`,_jsx(_components.p,{children:`Returns the approved submission object.`}),`\n`,_jsx(ResponseField,{name:`success`,type:`boolean`,id:`param-success`,children:_jsxs(_components.p,{children:[`Always `,_jsx(_components.code,{children:`true`}),` for successful responses`]})}),`\n`,_jsxs(ResponseField,{name:`data`,type:`object`,id:`param-data`,children:[_jsx(_components.p,{children:`The submission.`}),_jsxs(Expandable,{title:`Data Object Properties`,children:[_jsx(ResponseField,{name:`id`,type:`string`,id:`param-id-1`,children:_jsx(_components.p,{children:`Encoded submission id`})}),_jsx(ResponseField,{name:`campaign_id`,type:`string`,id:`param-campaign-id`,children:_jsx(_components.p,{children:`Encoded campaign id`})}),_jsx(ResponseField,{name:`affiliate_id`,type:`string`,id:`param-affiliate-id`,children:_jsx(_components.p,{children:`Affiliate id`})}),_jsx(ResponseField,{name:`status`,type:`string`,id:`param-status`,children:_jsxs(_components.p,{children:[`Submission status. After approval this is `,_jsx(_components.code,{children:`\"APPROVED\"`}),`. Valid values: `,_jsx(_components.code,{children:`PENDING`}),`, `,_jsx(_components.code,{children:`APPROVED`}),`, `,_jsx(_components.code,{children:`REJECTED`}),`.`]})}),_jsx(ResponseField,{name:`custom_reward_amount`,type:`number | null`,id:`param-custom-reward-amount`,children:_jsx(_components.p,{children:`Reward amount written to the submission on approval. Not written for retainer submissions.`})}),_jsx(ResponseField,{name:`earning_id`,type:`string | null`,id:`param-earning-id`,children:_jsxs(_components.p,{children:[`Id of the earning created by this approval. `,_jsx(_components.code,{children:`null`}),` for retainer submissions, which create no earning, and for approvals made before earnings were created on approval.`]})}),_jsx(ResponseField,{name:`earning_status`,type:`string | null`,id:`param-earning-status`,children:_jsxs(_components.p,{children:[`Current status of the earning. A newly created earning is `,_jsx(_components.code,{children:`\"READY_FOR_PAYMENT\"`}),`. `,_jsx(_components.code,{children:`null`}),` when `,_jsx(_components.code,{children:`earning_id`}),` is `,_jsx(_components.code,{children:`null`}),`.`]})}),_jsx(ResponseField,{name:`reviewed_at`,type:`string | null`,id:`param-reviewed-at`,children:_jsx(_components.p,{children:`ISO 8601 review timestamp`})}),_jsx(ResponseField,{name:`created_at`,type:`string`,id:`param-created-at`,children:_jsx(_components.p,{children:`ISO 8601 creation timestamp`})}),_jsx(ResponseField,{name:`updated_at`,type:`string`,id:`param-updated-at`,children:_jsx(_components.p,{children:`ISO 8601 update timestamp`})}),_jsx(ResponseField,{name:`campaign_closed_by_budget`,type:`boolean`,id:`param-campaign-closed-by-budget`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`true`}),` when this approval reached or exceeded the campaign’s `,_jsx(_components.code,{children:`max_budget`}),` and moved the campaign to `,_jsx(_components.code,{children:`ENDED`})]})}),_jsx(ResponseField,{name:`rejected_pending_applications`,type:`integer`,id:`param-rejected-pending-applications`,children:_jsxs(_components.p,{children:[`Number of pending applications rejected by this call. Non-zero only when `,_jsx(_components.code,{children:`reject_open_applications`}),` is `,_jsx(_components.code,{children:`true`}),` and the campaign was closed by budget.`]})})]})]}),`\n`,`\n`,`\n`,_jsx(Heading,{level:`2`,id:`earning`,children:`Earning`}),`\n`,_jsxs(_components.p,{children:[`For `,_jsx(_components.code,{children:`flat_rate`}),`, `,_jsx(_components.code,{children:`custom`}),`, and `,_jsx(_components.code,{children:`range`}),` campaigns, approval creates one earning in the same transaction:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`earning_type`}),` is `,_jsx(_components.code,{children:`CAMPAIGN_REWARD`}),`, with status `,_jsx(_components.code,{children:`READY_FOR_PAYMENT`}),` and no hold period.`]}),`\n`,_jsx(_components.li,{children:`The amount is the approved reward amount, in your team’s currency.`}),`\n`,_jsx(_components.li,{children:`The earning’s description is the campaign name.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Retainer proof submissions create no earning. Retainer earnings are created per period and approved separately with `,_jsx(_components.a,{href:`/api/endpoint/campaigns/approve-retainer-period`,children:`Approve Retainer Period`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`partner-email`,children:`Partner email`}),`\n`,_jsxs(_components.p,{children:[`When approval creates an earning, the partner approval email is queued in the same transaction. No email is queued when the `,_jsx(_components.code,{children:`campaign-submission-approved`}),` `,_jsx(_components.a,{href:`/api/endpoint/program/list-notifications`,children:`email notification`}),` is disabled, when the program has no portal settings, or when the affiliate has no valid email address. None of these affect earning creation.`]}),`\n`,_jsx(Heading,{level:`2`,id:`max-budget`,children:`Max budget`}),`\n`,_jsxs(_components.p,{children:[`If the approved amount brings the campaign’s approved reward spend to or above its owner `,_jsx(_components.code,{children:`max_budget`}),`, the approval still succeeds. A campaign with `,_jsx(_components.code,{children:`status`}),` `,_jsx(_components.code,{children:`ACTIVE`}),` or `,_jsx(_components.code,{children:`SCHEDULED`}),` is then moved to `,_jsx(_components.code,{children:`ENDED`}),` and `,_jsx(_components.code,{children:`campaign_closed_by_budget`}),` is `,_jsx(_components.code,{children:`true`}),`. Submissions of an `,_jsx(_components.code,{children:`ENDED`}),` campaign can still be approved.`]}),`\n`,_jsx(Heading,{level:`2`,id:`notes`,children:`Notes`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Requires `,_jsx(_components.code,{children:`write:affiliates`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`There is no public endpoint for listing submissions. The `,_jsx(_components.a,{href:`/mcp/tools/campaigns`,children:_jsx(_components.code,{children:`affonso_approve_campaign_submission`})}),` MCP tool has the same limitation.`]}),`\n`,_jsxs(_components.li,{children:[`Approving an already `,_jsx(_components.code,{children:`APPROVED`}),` submission is idempotent (HTTP 200). It returns the existing submission with its `,_jsx(_components.code,{children:`earning_id`}),` and `,_jsx(_components.code,{children:`earning_status`}),`, creates no new earning or email, and reports `,_jsx(_components.code,{children:`campaign_closed_by_budget`}),` as `,_jsx(_components.code,{children:`false`}),` and `,_jsx(_components.code,{children:`rejected_pending_applications`}),` as `,_jsx(_components.code,{children:`0`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`REJECTED`}),` submission returns `,_jsx(_components.code,{children:`CONFLICT`}),` (HTTP 409). If a concurrent call reviews the submission first, the call may also return `,_jsx(_components.code,{children:`CONFLICT`}),` with “This submission was already reviewed”.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`custom`}),` and `,_jsx(_components.code,{children:`range`}),` campaigns without an `,_jsx(_components.code,{children:`amount`}),` return `,_jsx(_components.code,{children:`VALIDATION_ERROR`}),` (HTTP 400) with `,_jsx(_components.code,{children:`field`}),` `,_jsx(_components.code,{children:`amount`}),`. An `,_jsx(_components.code,{children:`amount`}),` below 0.01 or above 999,999.99 fails body validation and returns `,_jsx(_components.code,{children:`VALIDATION_ERROR`}),` (HTTP 400) with `,_jsx(_components.code,{children:`details`}),`, before the submission is claimed, so no earning is created.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Approve Campaign Submission","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/submissions/{submissionId}/approve","description":"Approve a pending campaign submission and create its earning","href":"/api/endpoint/campaigns/approve-submission"}}},"mdxSourceWithNoJs":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Expandable,Heading,ParamField,RequestExample,ResponseExample,ResponseField}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!RequestExample)_missingMdxReference(`RequestExample`,true);if(!ResponseExample)_missingMdxReference(`ResponseExample`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Approve a `,_jsx(_components.code,{children:`PENDING`}),` submission. For non-retainer campaigns, approval creates one `,_jsx(_components.code,{children:`CAMPAIGN_REWARD`}),` earning in `,_jsx(_components.code,{children:`READY_FOR_PAYMENT`}),` and queues the partner approval email. Requires `,_jsx(_components.code,{children:`write:affiliates`}),`. Foreign-team IDs return 404.`]}),`\n`,_jsxs(_components.p,{children:[`The same operation is available through the `,_jsx(_components.a,{href:`/mcp/tools/campaigns`,children:_jsx(_components.code,{children:`affonso_approve_campaign_submission`})}),` MCP tool.`]}),`\n`,_jsx(Heading,{level:`2`,id:`path-parameters`,children:`Path Parameters`}),`\n`,_jsx(ParamField,{path:`id`,type:`string`,required:true,id:`param-id`,children:_jsx(_components.p,{children:`Encoded campaign id`})}),`\n`,_jsx(ParamField,{path:`submissionId`,type:`string`,required:true,id:`param-submission-id`,children:_jsxs(_components.p,{children:[`Encoded submission id. No public REST endpoint, MCP tool, or webhook lists campaign submissions or returns their ids, so get it from the submission in Affonso. This endpoint returns it as `,_jsx(_components.code,{children:`id`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`body-parameters`,children:`Body Parameters`}),`\n`,_jsx(_components.p,{children:`The body is optional. Unknown body fields are rejected.`}),`\n`,_jsx(ParamField,{body:`amount`,type:`number`,id:`param-amount`,children:_jsxs(_components.p,{children:[`Reward amount. Required for `,_jsx(_components.code,{children:`custom`}),` and `,_jsx(_components.code,{children:`range`}),` campaigns. Minimum 0.01, maximum 999,999.99. The amount is not checked against the published `,_jsx(_components.code,{children:`reward_amount_min`}),` / `,_jsx(_components.code,{children:`reward_amount_max`}),` of a `,_jsx(_components.code,{children:`range`}),` campaign. Ignored for `,_jsx(_components.code,{children:`flat_rate`}),` (the campaign’s `,_jsx(_components.code,{children:`reward_amount`}),` is used) and `,_jsx(_components.code,{children:`retainer`}),` campaigns.`]})}),`\n`,_jsx(ParamField,{body:`reject_open_applications`,type:`boolean`,id:`param-reject-open-applications`,children:_jsxs(_components.p,{children:[`Only applies when this approval reaches the campaign’s `,_jsx(_components.code,{children:`max_budget`}),` and closes the campaign. When `,_jsx(_components.code,{children:`true`}),`, all `,_jsx(_components.code,{children:`PENDING`}),` applications are rejected. When omitted or `,_jsx(_components.code,{children:`false`}),`, they stay open.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`response`,children:`Response`}),`\n`,_jsx(_components.p,{children:`Returns the approved submission object.`}),`\n`,_jsx(ResponseField,{name:`success`,type:`boolean`,id:`param-success`,children:_jsxs(_components.p,{children:[`Always `,_jsx(_components.code,{children:`true`}),` for successful responses`]})}),`\n`,_jsxs(ResponseField,{name:`data`,type:`object`,id:`param-data`,children:[_jsx(_components.p,{children:`The submission.`}),_jsxs(Expandable,{title:`Data Object Properties`,children:[_jsx(ResponseField,{name:`id`,type:`string`,id:`param-id-1`,children:_jsx(_components.p,{children:`Encoded submission id`})}),_jsx(ResponseField,{name:`campaign_id`,type:`string`,id:`param-campaign-id`,children:_jsx(_components.p,{children:`Encoded campaign id`})}),_jsx(ResponseField,{name:`affiliate_id`,type:`string`,id:`param-affiliate-id`,children:_jsx(_components.p,{children:`Affiliate id`})}),_jsx(ResponseField,{name:`status`,type:`string`,id:`param-status`,children:_jsxs(_components.p,{children:[`Submission status. After approval this is `,_jsx(_components.code,{children:`\"APPROVED\"`}),`. Valid values: `,_jsx(_components.code,{children:`PENDING`}),`, `,_jsx(_components.code,{children:`APPROVED`}),`, `,_jsx(_components.code,{children:`REJECTED`}),`.`]})}),_jsx(ResponseField,{name:`custom_reward_amount`,type:`number | null`,id:`param-custom-reward-amount`,children:_jsx(_components.p,{children:`Reward amount written to the submission on approval. Not written for retainer submissions.`})}),_jsx(ResponseField,{name:`earning_id`,type:`string | null`,id:`param-earning-id`,children:_jsxs(_components.p,{children:[`Id of the earning created by this approval. `,_jsx(_components.code,{children:`null`}),` for retainer submissions, which create no earning, and for approvals made before earnings were created on approval.`]})}),_jsx(ResponseField,{name:`earning_status`,type:`string | null`,id:`param-earning-status`,children:_jsxs(_components.p,{children:[`Current status of the earning. A newly created earning is `,_jsx(_components.code,{children:`\"READY_FOR_PAYMENT\"`}),`. `,_jsx(_components.code,{children:`null`}),` when `,_jsx(_components.code,{children:`earning_id`}),` is `,_jsx(_components.code,{children:`null`}),`.`]})}),_jsx(ResponseField,{name:`reviewed_at`,type:`string | null`,id:`param-reviewed-at`,children:_jsx(_components.p,{children:`ISO 8601 review timestamp`})}),_jsx(ResponseField,{name:`created_at`,type:`string`,id:`param-created-at`,children:_jsx(_components.p,{children:`ISO 8601 creation timestamp`})}),_jsx(ResponseField,{name:`updated_at`,type:`string`,id:`param-updated-at`,children:_jsx(_components.p,{children:`ISO 8601 update timestamp`})}),_jsx(ResponseField,{name:`campaign_closed_by_budget`,type:`boolean`,id:`param-campaign-closed-by-budget`,children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`true`}),` when this approval reached or exceeded the campaign’s `,_jsx(_components.code,{children:`max_budget`}),` and moved the campaign to `,_jsx(_components.code,{children:`ENDED`})]})}),_jsx(ResponseField,{name:`rejected_pending_applications`,type:`integer`,id:`param-rejected-pending-applications`,children:_jsxs(_components.p,{children:[`Number of pending applications rejected by this call. Non-zero only when `,_jsx(_components.code,{children:`reject_open_applications`}),` is `,_jsx(_components.code,{children:`true`}),` and the campaign was closed by budget.`]})})]})]}),`\n`,_jsxs(RequestExample,{children:[_jsx(CodeBlock,{filename:`cURL (custom or range campaign)`,numberOfLines:`6`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.affonso.io/v1/program/campaigns/cmcustom01camp0001/submissions/cmsub01custom00001/approve\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer sk_live_your_api_key\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"amount\": 250`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`cURL (flat rate campaign)`,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.affonso.io/v1/program/campaigns/cmlaunch01camp0001/submissions/cmsub01launch00001/approve\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer sk_live_your_api_key\"`})]}),`\n`]})})})]}),`\n`,_jsx(ResponseExample,{children:_jsx(CodeBlock,{filename:`Response (flat rate)`,numberOfLines:`17`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"success\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cmsub01launch00001\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"campaign_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cmlaunch01camp0001\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"affiliate_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"aff_abc123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"APPROVED\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"custom_reward_amount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`100`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"earning_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"cmearn01launch0001\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"earning_status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"READY_FOR_PAYMENT\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"reviewed_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-07T12:00:00.000Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"created_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-06T15:20:00.000Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"updated_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-10-07T12:00:00.000Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"campaign_closed_by_budget\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"rejected_pending_applications\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`0`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})}),`\n`,_jsx(Heading,{level:`2`,id:`earning`,children:`Earning`}),`\n`,_jsxs(_components.p,{children:[`For `,_jsx(_components.code,{children:`flat_rate`}),`, `,_jsx(_components.code,{children:`custom`}),`, and `,_jsx(_components.code,{children:`range`}),` campaigns, approval creates one earning in the same transaction:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`earning_type`}),` is `,_jsx(_components.code,{children:`CAMPAIGN_REWARD`}),`, with status `,_jsx(_components.code,{children:`READY_FOR_PAYMENT`}),` and no hold period.`]}),`\n`,_jsx(_components.li,{children:`The amount is the approved reward amount, in your team’s currency.`}),`\n`,_jsx(_components.li,{children:`The earning’s description is the campaign name.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Retainer proof submissions create no earning. Retainer earnings are created per period and approved separately with `,_jsx(_components.a,{href:`/api/endpoint/campaigns/approve-retainer-period`,children:`Approve Retainer Period`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`partner-email`,children:`Partner email`}),`\n`,_jsxs(_components.p,{children:[`When approval creates an earning, the partner approval email is queued in the same transaction. No email is queued when the `,_jsx(_components.code,{children:`campaign-submission-approved`}),` `,_jsx(_components.a,{href:`/api/endpoint/program/list-notifications`,children:`email notification`}),` is disabled, when the program has no portal settings, or when the affiliate has no valid email address. None of these affect earning creation.`]}),`\n`,_jsx(Heading,{level:`2`,id:`max-budget`,children:`Max budget`}),`\n`,_jsxs(_components.p,{children:[`If the approved amount brings the campaign’s approved reward spend to or above its owner `,_jsx(_components.code,{children:`max_budget`}),`, the approval still succeeds. A campaign with `,_jsx(_components.code,{children:`status`}),` `,_jsx(_components.code,{children:`ACTIVE`}),` or `,_jsx(_components.code,{children:`SCHEDULED`}),` is then moved to `,_jsx(_components.code,{children:`ENDED`}),` and `,_jsx(_components.code,{children:`campaign_closed_by_budget`}),` is `,_jsx(_components.code,{children:`true`}),`. Submissions of an `,_jsx(_components.code,{children:`ENDED`}),` campaign can still be approved.`]}),`\n`,_jsx(Heading,{level:`2`,id:`notes`,children:`Notes`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Requires `,_jsx(_components.code,{children:`write:affiliates`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`There is no public endpoint for listing submissions. The `,_jsx(_components.a,{href:`/mcp/tools/campaigns`,children:_jsx(_components.code,{children:`affonso_approve_campaign_submission`})}),` MCP tool has the same limitation.`]}),`\n`,_jsxs(_components.li,{children:[`Approving an already `,_jsx(_components.code,{children:`APPROVED`}),` submission is idempotent (HTTP 200). It returns the existing submission with its `,_jsx(_components.code,{children:`earning_id`}),` and `,_jsx(_components.code,{children:`earning_status`}),`, creates no new earning or email, and reports `,_jsx(_components.code,{children:`campaign_closed_by_budget`}),` as `,_jsx(_components.code,{children:`false`}),` and `,_jsx(_components.code,{children:`rejected_pending_applications`}),` as `,_jsx(_components.code,{children:`0`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.code,{children:`REJECTED`}),` submission returns `,_jsx(_components.code,{children:`CONFLICT`}),` (HTTP 409). If a concurrent call reviews the submission first, the call may also return `,_jsx(_components.code,{children:`CONFLICT`}),` with “This submission was already reviewed”.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`custom`}),` and `,_jsx(_components.code,{children:`range`}),` campaigns without an `,_jsx(_components.code,{children:`amount`}),` return `,_jsx(_components.code,{children:`VALIDATION_ERROR`}),` (HTTP 400) with `,_jsx(_components.code,{children:`field`}),` `,_jsx(_components.code,{children:`amount`}),`. An `,_jsx(_components.code,{children:`amount`}),` below 0.01 or above 999,999.99 fails body validation and returns `,_jsx(_components.code,{children:`VALIDATION_ERROR`}),` (HTTP 400) with `,_jsx(_components.code,{children:`details`}),`, before the submission is claimed, so no earning is created.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Approve Campaign Submission","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/submissions/{submissionId}/approve","description":"Approve a pending campaign submission and create its earning","href":"/api/endpoint/campaigns/approve-submission"}}}},"mdxExtracts":{"tableOfContents":[{"title":"Path Parameters","slug":"path-parameters","depth":2,"children":[]},{"title":"Body Parameters","slug":"body-parameters","depth":2,"children":[]},{"title":"Response","slug":"response","depth":2,"children":[]},{"title":"Earning","slug":"earning","depth":2,"children":[]},{"title":"Partner email","slug":"partner-email","depth":2,"children":[]},{"title":"Max budget","slug":"max-budget","depth":2,"children":[]},{"title":"Notes","slug":"notes","depth":2,"children":[]}],"codeExamples":{"request":{"type":"RequestExample","children":[{"filename":"cURL (custom or range campaign)","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"6\">\u003cspan class=\"line\">\u003cspan style=\"color:#953800;--shiki-dark:#DCDCAA\">curl\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -X\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> POST\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"https://api.affonso.io/v1/program/campaigns/cmcustom01camp0001/submissions/cmsub01custom00001/approve\"\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"Authorization: Bearer sk_live_your_api_key\"\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"Content-Type: application/json\"\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -d\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> '{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"amount\": 250\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> }'\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"},{"filename":"cURL (flat rate campaign)","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"shellscript\">\u003ccode language=\"shellscript\" numberOfLines=\"2\">\u003cspan class=\"line\">\u003cspan style=\"color:#953800;--shiki-dark:#DCDCAA\">curl\u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -X\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> POST\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"https://api.affonso.io/v1/program/campaigns/cmlaunch01camp0001/submissions/cmsub01launch00001/approve\"\u003c/span>\u003cspan style=\"color:#CF222E;--shiki-dark:#D7BA7D\"> \\\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\"> -H\u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\"> \"Authorization: Bearer sk_live_your_api_key\"\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]},"response":{"type":"ResponseExample","children":[{"filename":"Response (flat rate)","html":"\u003cpre class=\"shiki shiki-themes github-light-default dark-plus\" style=\"background-color:#ffffff;--shiki-dark-bg:#0B0C0E;color:#1f2328;--shiki-dark:#D4D4D4\" language=\"json\">\u003ccode language=\"json\" numberOfLines=\"17\">\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">{\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"success\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">true\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"data\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: {\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"id\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"cmsub01launch00001\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"campaign_id\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"cmlaunch01camp0001\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"affiliate_id\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"aff_abc123\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"status\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"APPROVED\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"custom_reward_amount\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">100\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"earning_id\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"cmearn01launch0001\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"earning_status\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"READY_FOR_PAYMENT\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"reviewed_at\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"2026-10-07T12:00:00.000Z\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"created_at\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"2026-10-06T15:20:00.000Z\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"updated_at\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0A3069;--shiki-dark:#CE9178\">\"2026-10-07T12:00:00.000Z\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"campaign_closed_by_budget\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#569CD6\">false\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">,\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#116329;--shiki-dark:#9CDCFE\"> \"rejected_pending_applications\"\u003c/span>\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">: \u003c/span>\u003cspan style=\"color:#0550AE;--shiki-dark:#B5CEA8\">0\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\"> }\u003c/span>\u003c/span>\n\u003cspan class=\"line\">\u003cspan style=\"color:#1F2328;--shiki-dark:#D4D4D4\">}\u003c/span>\u003c/span>\n\u003c/code>\u003c/pre>"}],"attributes":[]}},"endpoint":{"title":"Approve Campaign Submission","path":"/v1/program/campaigns/{id}/submissions/{submissionId}/approve","servers":[{"url":"https://api.affonso.io"}],"method":"post","request":{"security":[{"title":"Bearer Auth","parameters":{"header":{"Authorization":{"type":"http","scheme":"bearer","description":"Bearer authentication header of the form `Bearer \u003ctoken>`, where `\u003ctoken>` is your auth token."}},"query":{},"cookie":{}}}],"parameters":{"query":{},"header":{},"cookie":{},"path":{"id":{"schema":[{"type":"string","description":"Encoded campaign id","required":true}]},"submissionId":{"schema":[{"type":"string","description":"Encoded submission id. No public REST endpoint, MCP tool, or webhook lists campaign submissions or returns their ids, so get it from the submission in Affonso. This endpoint returns it as `id` .","required":true}]}}},"body":{"application/json":{"schemaArray":[{"type":"object","properties":{"amount":[{"type":"number","description":"Reward amount. Required for `custom` and `range` campaigns. Minimum 0.01, maximum 999,999.99. The amount is not checked against the published `reward_amount_min` / `reward_amount_max` of a `range` campaign. Ignored for `flat_rate` (the campaign’s `reward_amount` is used) and `retainer` campaigns."}],"reject_open_applications":[{"type":"boolean","description":"Only applies when this approval reaches the campaign’s `max_budget` and closes the campaign. When `true` , all `PENDING` applications are rejected. When omitted or `false` , they stay open."}]}}],"examples":{"example":{"value":{"amount":123,"reject_open_applications":true}}}}}},"response":{"200":{"application/json":{"schemaArray":[{"type":"object","properties":{"success":[{"type":"boolean","description":"Always `true` for successful responses"}],"data":[{"type":"object","properties":{"id":[{"type":"string","description":"Encoded submission id"}],"campaign_id":[{"type":"string","description":"Encoded campaign id"}],"affiliate_id":[{"type":"string","description":"Affiliate id"}],"status":[{"type":"string","description":"Submission status. After approval this is `\"APPROVED\"` . Valid values: `PENDING` , `APPROVED` , `REJECTED` ."}],"custom_reward_amount":[{"type":"object","properties":{},"description":"Reward amount written to the submission on approval. Not written for retainer submissions."}],"earning_id":[{"type":"object","properties":{},"description":"Id of the earning created by this approval. `null` for retainer submissions, which create no earning, and for approvals made before earnings were created on approval."}],"earning_status":[{"type":"object","properties":{},"description":"Current status of the earning. A newly created earning is `\"READY_FOR_PAYMENT\"` . `null` when `earning_id` is `null` ."}],"reviewed_at":[{"type":"object","properties":{},"description":"ISO 8601 review timestamp"}],"created_at":[{"type":"string","description":"ISO 8601 creation timestamp"}],"updated_at":[{"type":"string","description":"ISO 8601 update timestamp"}],"campaign_closed_by_budget":[{"type":"boolean","description":"`true` when this approval reached or exceeded the campaign’s `max_budget` and moved the campaign to `ENDED`"}],"rejected_pending_applications":[{"type":"integer","description":"Number of pending applications rejected by this call. Non-zero only when `reject_open_applications` is `true` and the campaign was closed by budget."}]},"description":"The submission."}]}}],"examples":{"example":{"value":{"success":true,"data":{"id":"\u003cstring>","campaign_id":"\u003cstring>","affiliate_id":"\u003cstring>","status":"\u003cstring>","custom_reward_amount":{},"earning_id":{},"earning_status":{},"reviewed_at":{},"created_at":"\u003cstring>","updated_at":"\u003cstring>","campaign_closed_by_budget":true,"rejected_pending_applications":123}}}}}}},"deprecated":false}},"jsLinks":[],"subdomain":"affonso-20c7dee8","siteName":"Affonso Docs","title":"Approve Campaign Submission - Affonso Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-26T10:51:42.297Z","originalFileLocation":"api/endpoint/campaigns/approve-submission.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Approve a pending campaign submission and create its earning\">\u003cmeta data-mint-head name=\"application-name\" content=\"Affonso Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Approve Campaign Submission - Affonso Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Approve a pending campaign submission and create its earning\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Affonso Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://affonso-20c7dee8.mintlify.app/_mintlify/api/og/v2?division=Campaigns\u0026amp;title=Approve+Campaign+Submission\u0026amp;description=Approve+a+pending+campaign+submission+and+create+its+earning\u0026amp;theme=bbdaa51877c05a503c14f1e9\u0026amp;signature=17056799de0027e62aea23f85fa61095782eec5f7207cb03dc4b47c471bfd4e6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Approve Campaign Submission - Affonso Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Approve a pending campaign submission and create its earning\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://affonso-20c7dee8.mintlify.app/_mintlify/api/og/v2?division=Campaigns\u0026amp;title=Approve+Campaign+Submission\u0026amp;description=Approve+a+pending+campaign+submission+and+create+its+earning\u0026amp;theme=bbdaa51877c05a503c14f1e9\u0026amp;signature=17056799de0027e62aea23f85fa61095782eec5f7207cb03dc4b47c471bfd4e6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/affonso-20c7dee8/o8Zy3ftrGGF8u7vC/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Affonso Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#881337\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/endpoint/campaigns/approve-submission.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.affonso.io/#organization\",\"name\":\"Affonso Docs\",\"url\":\"https://docs.affonso.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/affonso-20c7dee8/nWO6r2CUpJ-o-z8l/logo/affonso_logo_small.png?fit=max\u0026auto=format\u0026n=nWO6r2CUpJ-o-z8l\u0026q=85\u0026s=4b239574262c42f95697481e8b29adce\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.affonso.io#website\",\"name\":\"Affonso Docs\",\"url\":\"https://docs.affonso.io\",\"publisher\":{\"@id\":\"https://docs.affonso.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission#webpage\",\"url\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission\",\"name\":\"Approve Campaign Submission\",\"description\":\"Approve a pending campaign submission and create its earning\",\"dateModified\":\"2026-10-26T10:51:42.297Z\",\"isPartOf\":{\"@id\":\"https://docs.affonso.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Program Management\",\"item\":\"https://docs.affonso.io/api/endpoint/program/get-info\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Campaigns\",\"item\":\"https://docs.affonso.io/api/endpoint/campaigns/list\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Approve Campaign Submission\",\"item\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission#apireference\",\"headline\":\"Approve Campaign Submission\",\"name\":\"Approve Campaign Submission\",\"description\":\"Approve a pending campaign submission and create its earning\",\"url\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission\",\"mainEntityOfPage\":{\"@id\":\"https://docs.affonso.io/api/endpoint/campaigns/approve-submission#webpage\"},\"dateModified\":\"2026-10-26T10:51:42.297Z\",\"publisher\":{\"@id\":\"https://docs.affonso.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.affonso.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Affonso Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Affonso Docs","nav":{"global":{"anchors":[{"anchor":"Home","icon":"home","href":"https://affonso.io"},{"anchor":"Blog","icon":"newspaper","href":"https://affonso.io/blog"},{"anchor":"Help Center","icon":"book-open-cover","href":"https://affonso.io/help"}]},"tabs":[{"tab":"API Reference","groups":[{"group":"Getting Started","pages":[{"title":"API Introduction","href":"/api/introduction"},{"title":"Authentication","href":"/api/authentication"},{"title":"Rate Limits","href":"/api/rate-limits"},{"title":"TypeScript SDK","href":"/api/sdk/typescript"}]},{"group":"Guide","pages":[{"title":"Track With Tracking Pixel","href":"/api/with-tracking-pixel"},{"title":"Track Without Tracking Pixel","href":"/api/without-tracking-pixel"},{"title":"Proxy Setup (Optional)","href":"/api/proxy-setup"},{"title":"Server-Side Tracking","href":"/api/server-side-tracking"},{"title":"Embedded Referral Dashboard","href":"/api/embedded-dashboard"},{"title":"Segment Track Events","href":"/api/segment-track-events"}]},{"group":"Core Resources","pages":[{"group":"Clicks","pages":[{"title":"Track Click","api":"POST https://api.affonso.io/v1/clicks","href":"/api/endpoint/clicks/create"}]},{"group":"Signups","pages":[{"title":"Record Lead Signup","api":"POST /v1/signups","href":"/api/endpoint/signups/create"}]},{"group":"Conversions","pages":[{"title":"Create Conversion","api":"POST https://api.affonso.io/v1/conversions","href":"/api/endpoint/conversions/create"},{"title":"Refund Conversion","api":"POST https://api.affonso.io/v1/conversions/{id}/refund","href":"/api/endpoint/conversions/refund"}]},{"group":"Events","pages":[{"title":"Create Event","api":"POST https://api.affonso.io/v1/events","href":"/api/endpoint/events/create"}]},{"group":"Affiliates","pages":[{"title":"List Affiliates","api":"GET https://api.affonso.io/v1/affiliates","href":"/api/endpoint/affiliates/list"},{"title":"Get Affiliate","api":"GET https://api.affonso.io/v1/affiliates/{id}","href":"/api/endpoint/affiliates/get"},{"title":"Get Affiliate Analytics","api":"GET https://api.affonso.io/v1/affiliates/{id}/analytics","href":"/api/endpoint/affiliates/analytics"},{"title":"Create Affiliate","api":"POST https://api.affonso.io/v1/affiliates","href":"/api/endpoint/affiliates/create"},{"title":"Update Affiliate","api":"PUT https://api.affonso.io/v1/affiliates/{id}","href":"/api/endpoint/affiliates/update"},{"title":"Delete Affiliate","api":"DELETE https://api.affonso.io/v1/affiliates/{id}","href":"/api/endpoint/affiliates/delete"},{"title":"Generate Portal Login Token","api":"POST https://api.affonso.io/v1/affiliates/{id}/portal-token","href":"/api/endpoint/affiliates/portal-token"}]},{"group":"Fraud Events","pages":[{"title":"List Fraud Events","api":"GET https://api.affonso.io/v1/fraud-events","href":"/api/endpoint/fraud-events/list"},{"title":"Confirm Fraud Events","api":"POST https://api.affonso.io/v1/fraud-events/confirm","href":"/api/endpoint/fraud-events/confirm"},{"title":"Resolve Fraud Events","api":"POST https://api.affonso.io/v1/fraud-events/resolve","href":"/api/endpoint/fraud-events/resolve"}]},{"group":"Referrals","pages":[{"title":"List Referrals","api":"GET https://api.affonso.io/v1/referrals","href":"/api/endpoint/referrals/list"},{"title":"Get Referral","api":"GET https://api.affonso.io/v1/referrals/{id}","href":"/api/endpoint/referrals/get"},{"title":"Create Referral","api":"POST https://api.affonso.io/v1/referrals","href":"/api/endpoint/referrals/create"},{"title":"Update Referral","api":"PUT https://api.affonso.io/v1/referrals/{id}","href":"/api/endpoint/referrals/update"},{"title":"Delete Referral","api":"DELETE https://api.affonso.io/v1/referrals/{id}","href":"/api/endpoint/referrals/delete"}]},{"group":"Commissions","pages":[{"title":"List Commissions","api":"GET https://api.affonso.io/v1/commissions","href":"/api/endpoint/commissions/list"},{"title":"Get Commission","api":"GET https://api.affonso.io/v1/commissions/{id}","href":"/api/endpoint/commissions/get"},{"title":"Create Commission","api":"POST https://api.affonso.io/v1/commissions","href":"/api/endpoint/commissions/create"},{"title":"Create Bonus","api":"POST https://api.affonso.io/v1/commissions/bonus","href":"/api/endpoint/commissions/bonus"},{"title":"Update Commission","api":"PUT https://api.affonso.io/v1/commissions/{id}","href":"/api/endpoint/commissions/update"},{"title":"Delete Commission","api":"DELETE https://api.affonso.io/v1/commissions/{id}","href":"/api/endpoint/commissions/delete"}]},{"group":"Payouts","pages":[{"title":"List Payouts","api":"GET https://api.affonso.io/v1/payouts","href":"/api/endpoint/payouts/list"},{"title":"Get Payout","api":"GET https://api.affonso.io/v1/payouts/{id}","href":"/api/endpoint/payouts/get"},{"title":"Update Payout","api":"PUT https://api.affonso.io/v1/payouts/{id}","href":"/api/endpoint/payouts/update"}]},{"group":"Coupons","pages":[{"title":"List Coupons","api":"GET https://api.affonso.io/v1/coupons","href":"/api/endpoint/coupons/list"},{"title":"Get Coupon","api":"GET https://api.affonso.io/v1/coupons/{id}","href":"/api/endpoint/coupons/get"},{"title":"Create Coupon","api":"POST https://api.affonso.io/v1/coupons","href":"/api/endpoint/coupons/create"},{"title":"Delete Coupon","api":"DELETE https://api.affonso.io/v1/coupons/{id}","href":"/api/endpoint/coupons/delete"}]},{"group":"Embed","pages":[{"title":"Create Embed Token","api":"POST https://api.affonso.io/v1/embed/token","href":"/api/endpoint/embed/create-token"},{"title":"Get Embed Data","api":"GET https://api.affonso.io/v1/embed/data","href":"/api/endpoint/embed/get-data"},{"title":"Create Self-Service Coupon","api":"POST https://api.affonso.io/v1/embed/coupon","href":"/api/endpoint/embed/create-coupon"}]},{"group":"Affiliate Finder","pages":[{"title":"Start Finder Search","api":"POST https://api.affonso.io/v1/finder/searches","href":"/api/endpoint/finder/start-search"},{"title":"List Finder Searches","api":"GET https://api.affonso.io/v1/finder/searches","href":"/api/endpoint/finder/list-searches"},{"title":"List Finder Results","api":"GET https://api.affonso.io/v1/finder/searches/{id}/results","href":"/api/endpoint/finder/list-results"},{"title":"List Finder Shortlist","api":"GET https://api.affonso.io/v1/finder/shortlist","href":"/api/endpoint/finder/list-shortlist"},{"title":"Add Finder Result to Shortlist","api":"POST https://api.affonso.io/v1/finder/shortlist","href":"/api/endpoint/finder/add-shortlist"},{"title":"Update Finder Shortlist Item","api":"PATCH https://api.affonso.io/v1/finder/shortlist/{id}","href":"/api/endpoint/finder/update-shortlist"},{"title":"Delete Finder Shortlist Item","api":"DELETE https://api.affonso.io/v1/finder/shortlist/{id}","href":"/api/endpoint/finder/delete-shortlist"}]}]},{"group":"Program Management","pages":[{"group":"Program Settings","pages":[{"group":"Info","pages":[{"title":"Get Program Info","api":"GET https://api.affonso.io/v1/program","href":"/api/endpoint/program/get-info"},{"title":"Update Program Info","api":"PATCH https://api.affonso.io/v1/program","href":"/api/endpoint/program/update-info"}]},{"group":"Brand Profile","pages":[{"title":"Get Brand Profile","api":"GET https://api.affonso.io/v1/program/brand","href":"/api/endpoint/program/get-brand-profile"},{"title":"Update Brand Profile","api":"PATCH https://api.affonso.io/v1/program/brand","href":"/api/endpoint/program/update-brand-profile"}]},{"group":"Payment Terms","pages":[{"title":"Get Payment Terms","api":"GET https://api.affonso.io/v1/program/payment-terms","href":"/api/endpoint/program/get-payment-terms"},{"title":"Update Payment Terms","api":"PATCH https://api.affonso.io/v1/program/payment-terms","href":"/api/endpoint/program/update-payment-terms"}]},{"group":"Tracking","pages":[{"title":"Get Tracking Settings","api":"GET https://api.affonso.io/v1/program/tracking","href":"/api/endpoint/program/get-tracking"},{"title":"Update Tracking Settings","api":"PATCH https://api.affonso.io/v1/program/tracking","href":"/api/endpoint/program/update-tracking"}]},{"group":"Restrictions","pages":[{"title":"Get Restrictions","api":"GET https://api.affonso.io/v1/program/restrictions","href":"/api/endpoint/program/get-restrictions"},{"title":"Update Restrictions","api":"PATCH https://api.affonso.io/v1/program/restrictions","href":"/api/endpoint/program/update-restrictions"}]},{"group":"Portal","pages":[{"title":"Get Portal Settings","api":"GET https://api.affonso.io/v1/program/portal","href":"/api/endpoint/program/get-portal"},{"title":"Update Portal Settings","api":"PATCH https://api.affonso.io/v1/program/portal","href":"/api/endpoint/program/update-portal"}]},{"group":"Fraud Rules","pages":[{"title":"Get Fraud Rules","api":"GET https://api.affonso.io/v1/program/fraud-rules","href":"/api/endpoint/program/get-fraud-rules"},{"title":"Update Fraud Rules","api":"PATCH https://api.affonso.io/v1/program/fraud-rules","href":"/api/endpoint/program/update-fraud-rules"}]},{"group":"Notifications","pages":[{"title":"List Notification Settings","api":"GET https://api.affonso.io/v1/program/notifications","href":"/api/endpoint/program/list-notifications"},{"title":"Update Notification Setting","api":"PATCH https://api.affonso.io/v1/program/notifications/{emailTypeId}","href":"/api/endpoint/program/update-notification"}]},{"group":"Affiliate Groups","pages":[{"title":"List Groups","api":"GET https://api.affonso.io/v1/program/groups","href":"/api/endpoint/program/list-groups"},{"title":"Get Group","api":"GET https://api.affonso.io/v1/program/groups/{id}","href":"/api/endpoint/program/get-group"},{"title":"Create Group","api":"POST https://api.affonso.io/v1/program/groups","href":"/api/endpoint/program/create-group"},{"title":"Update Group","api":"PATCH https://api.affonso.io/v1/program/groups/{id}","href":"/api/endpoint/program/update-group"},{"title":"Delete Group","api":"DELETE https://api.affonso.io/v1/program/groups/{id}","href":"/api/endpoint/program/delete-group"}]},{"group":"Promotion URLs","pages":[{"title":"List Promotion URLs","api":"GET https://api.affonso.io/v1/program/promotion-urls","href":"/api/endpoint/program/list-promotion-urls"},{"title":"Create Promotion URL","api":"POST https://api.affonso.io/v1/program/promotion-urls","href":"/api/endpoint/program/create-promotion-url"},{"title":"Get Promotion URL","api":"GET https://api.affonso.io/v1/program/promotion-urls/{id}","href":"/api/endpoint/program/get-promotion-url"},{"title":"Update Promotion URL","api":"PATCH https://api.affonso.io/v1/program/promotion-urls/{id}","href":"/api/endpoint/program/update-promotion-url"},{"title":"Delete Promotion URL","api":"DELETE https://api.affonso.io/v1/program/promotion-urls/{id}","href":"/api/endpoint/program/delete-promotion-url"},{"title":"Set Program Default Promotion URL","api":"PUT https://api.affonso.io/v1/program/promotion-urls/default","href":"/api/endpoint/program/set-promotion-url-default"},{"title":"Set Group Default Promotion URL","api":"PUT https://api.affonso.io/v1/program/groups/{groupId}/promotion-url-default","href":"/api/endpoint/program/set-group-promotion-url-default"}]},{"group":"Creatives","pages":[{"title":"List Creatives","api":"GET https://api.affonso.io/v1/program/creatives","href":"/api/endpoint/program/list-creatives"},{"title":"Get Creative","api":"GET https://api.affonso.io/v1/program/creatives/{id}","href":"/api/endpoint/program/get-creative"},{"title":"Create Creative","api":"POST https://api.affonso.io/v1/program/creatives","href":"/api/endpoint/program/create-creative"},{"title":"Update Creative","api":"PATCH https://api.affonso.io/v1/program/creatives/{id}","href":"/api/endpoint/program/update-creative"},{"title":"Delete Creative","api":"DELETE https://api.affonso.io/v1/program/creatives/{id}","href":"/api/endpoint/program/delete-creative"}]}]},{"group":"Campaigns","pages":[{"title":"List Campaigns","api":"GET https://api.affonso.io/v1/program/campaigns","href":"/api/endpoint/campaigns/list"},{"title":"Get Campaign","api":"GET https://api.affonso.io/v1/program/campaigns/{id}","href":"/api/endpoint/campaigns/get"},{"title":"Create Campaign","api":"POST https://api.affonso.io/v1/program/campaigns","href":"/api/endpoint/campaigns/create"},{"title":"Update Campaign","api":"PATCH https://api.affonso.io/v1/program/campaigns/{id}","href":"/api/endpoint/campaigns/update"},{"title":"List Campaign Applications","api":"GET https://api.affonso.io/v1/program/campaigns/{id}/applications","href":"/api/endpoint/campaigns/list-applications"},{"title":"Apply to Campaign","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/applications","href":"/api/endpoint/campaigns/apply"},{"title":"Accept Campaign Application","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/applications/{applicationId}/accept","href":"/api/endpoint/campaigns/accept-application"},{"title":"Reject Campaign Application","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/applications/{applicationId}/reject","description":"Reject a pending campaign application","href":"/api/endpoint/campaigns/reject-application"},{"title":"Approve Campaign Submission","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/submissions/{submissionId}/approve","href":"/api/endpoint/campaigns/approve-submission"},{"title":"Update Retainer Condition","api":"PATCH https://api.affonso.io/v1/program/campaigns/{id}/applications/{applicationId}/condition","description":"Update the retainer condition on an accepted application","href":"/api/endpoint/campaigns/update-retainer-condition"},{"title":"End Partner Retainer","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/applications/{applicationId}/end-retainer","href":"/api/endpoint/campaigns/end-retainer"},{"title":"Resume Partner Retainer","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/applications/{applicationId}/resume-retainer","href":"/api/endpoint/campaigns/resume-retainer"},{"title":"List Retainer Periods","api":"GET https://api.affonso.io/v1/program/campaigns/{id}/retainer-periods","href":"/api/endpoint/campaigns/list-retainer-periods"},{"title":"Approve Retainer Period","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/retainer-periods/{periodId}/approve","href":"/api/endpoint/campaigns/approve-retainer-period"},{"title":"Reject Retainer Period","api":"POST https://api.affonso.io/v1/program/campaigns/{id}/retainer-periods/{periodId}/reject","href":"/api/endpoint/campaigns/reject-retainer-period"}]},{"group":"Affiliate Onboarding","pages":[{"title":"Get Onboarding Form","api":"GET https://api.affonso.io/v1/onboarding-form","href":"/api/endpoint/onboarding/get-form"},{"title":"Create Onboarding Form","api":"POST https://api.affonso.io/v1/onboarding-form","href":"/api/endpoint/onboarding/create-form"},{"title":"Update Onboarding Form","api":"PATCH https://api.affonso.io/v1/onboarding-form","href":"/api/endpoint/onboarding/update-form"},{"title":"Delete Onboarding Form","api":"DELETE https://api.affonso.io/v1/onboarding-form","href":"/api/endpoint/onboarding/delete-form"},{"title":"Get Affiliate Onboarding Responses","api":"GET https://api.affonso.io/v1/affiliates/{id}/onboarding-responses","href":"/api/endpoint/onboarding/get-responses"},{"title":"Submit Onboarding Responses","api":"POST https://api.affonso.io/v1/affiliates/{id}/onboarding-responses","href":"/api/endpoint/onboarding/submit-responses"}]}]},{"group":"Marketplace","pages":[{"title":"List Marketplace Programs","api":"GET https://api.affonso.io/v1/marketplace","href":"/api/endpoint/marketplace/list"},{"title":"Get Marketplace Program","api":"GET https://api.affonso.io/v1/marketplace/{id}","href":"/api/endpoint/marketplace/get"}]}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/introduction"}]},{"tab":"CLI","pages":[{"title":"CLI","href":"/cli/introduction"}]},{"tab":"Webhooks","pages":[{"title":"Webhooks","href":"/webhooks/introduction"}]}]},"title":"Approve Campaign Submission - Affonso Docs","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js"]}