---
updatedAt: 2026-05-08T21:30:21.000Z
agentTools:
  projectIndex: https://developers.tackle.io/llms.txt
---

# Update a co-sell invitation

# OpenAPI definition

```json
{
  "openapi": "3.0.3",
  "info": {
    "title": "Tackle Co-Sell for AWS Partner Central",
    "description": "This API lets you create and manage co-sell opportunities and invitations\nin AWS Partner Central — formerly known as the AWS Partner Network Customer\nEngagement (ACE) program. Use it to share opportunities you originate\n(Partner Referrals) with AWS, and to receive, respond to, and manage\nopportunities and invitations that AWS originates (AWS Referrals) for\nyour account.\n\n## Authentication\n\nThis API requires a Tackle machine-to-machine (MTM) access token. Issue\nyour M2M client credentials following the [How to get an M2M client ID\nand secret](https://developers.tackle.io/docs/how-to-get-an-m2m-client-id-and-secret)\nguide, exchange them for an access token following the [Getting an\naccess token](https://developers.tackle.io/docs/getting-an-access-token)\nguide, then send the token with each request in the `Authorization`\nheader as `Bearer <access_token>`.\n\nThe MTM token supplies the vendor and organization context for the request.\nFine-grained scoped MTM permissions are not enforced for this API yet.\n\n## Pagination\n\n`listOpportunities`, `listInvitations`, and `listSolutions` use offset-based\npagination. Set `pageSize` (1–100, default 10) and either omit `from` to\nstart from the first record or set `from` to the value returned in\n`nextIndex` from the previous page's response. The response's `isNextPage`\nindicates whether more results are available; `nextIndex` is only present\nwhen `isNextPage` is `true`.\n\n`listOpportunityEvents` and `listInvitationEvents` use cursor-based\npagination via the `next` query parameter. The response schema includes a\n`next` cursor field reserved for future use; today no cursor value is\nemitted, so a single response returns the full event history for the\nrequested entity.\n\n## Errors\n\nMost 4xx and 5xx responses use the `Error` envelope (a JSON object with a\nhuman-readable `message`). Some responses are returned as empty bodies\n(typically direct `Unauthorized` and `Internal Server Error` responses) —\nclients should be tolerant of an empty body and treat the HTTP status code\nas authoritative.\n\n## Related Tackle Co-Sell APIs\n\nTackle publishes equivalent Co-Sell APIs for other cloud providers. Customer\nengagement domain models differ across providers (AWS and Google Cloud\nChannel use \"opportunities\"; Microsoft Partner Center uses \"referrals\"), so\nendpoint paths, request and response shapes, and pagination details are not\ninterchangeable.\n\n- Tackle Co-Sell for Google Cloud Channel: https://gcp.cosell.tackle.io\n- Tackle Co-Sell for Microsoft Partner Center: https://msft.cosell.tackle.io",
    "version": "1.0"
  },
  "externalDocs": {
    "description": "Tackle Developer Portal",
    "url": "https://developers.tackle.io"
  },
  "servers": [
    {
      "url": "https://aws.cosell.tackle.io",
      "description": "AWS Co-Sell Service"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Invitations",
      "description": "Create (test-environment-only), read, update, and list co-sell\ninvitations — AWS-led requests to partner with you on a specific\nopportunity. Use the update operation to accept or reject an\ninvitation, and the history endpoint to inspect cloud-side detail."
    }
  ],
  "paths": {
    "/api/invitations/{invitation_id}": {
      "post": {
        "operationId": "updateInvitation",
        "summary": "Update a co-sell invitation",
        "tags": [
          "Invitations"
        ],
        "parameters": [
          {
            "in": "path",
            "name": "invitation_id",
            "required": true,
            "description": "The unique identifier for the invitation",
            "schema": {
              "type": "string",
              "example": "tackle-invitation-2kvfkeGp015GC1abcUHB2xChqOG"
            }
          },
          {
            "in": "header",
            "name": "tackle-operation-id",
            "schema": {
              "type": "string",
              "enum": [
                "acceptInvitation",
                "rejectInvitation"
              ],
              "description": "The unique identifier for the update operation"
            },
            "required": true,
            "example": "acceptInvitation"
          }
        ],
        "requestBody": {
          "description": "Body shape depends on the `tackle-operation-id` header. The body is parsed\ndifferently for each operation: `acceptInvitation` reads only `crmId`, and\n`rejectInvitation` reads only `rejectionReason`. Each property is optional at\nthe schema level and only meaningful for the matching operation; properties\nfor the other operation are ignored.\n\n**Body requirement by operation**:\n\n- For `acceptInvitation`, the request body is fully optional. An empty body,\n  `{}`, or `{\"crmId\": \"...\"}` are all accepted; an empty body skips body\n  parsing entirely.\n- For `rejectInvitation`, the request body must be a present, non-empty JSON\n  object — at minimum `{}`. An empty (zero-length) body fails to parse and\n  surfaces as a `500 Internal Server Error`, not a `400 Bad Request`. Always\n  send at least `{}` (or include `rejectionReason` to propagate a reason to\n  AWS Partner Central).",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "crmId": {
                    "type": "string",
                    "description": "Salesforce CRM ID for the opportunity that an accepted invitation\nshould be linked to. Optional, and only meaningful when\n`tackle-operation-id` is `acceptInvitation`. If supplied as a\n15-character Salesforce ID, it is converted to the canonical\n18-character form before being persisted and forwarded to AWS\nPartner Central. Ignored on reject-path requests.",
                    "example": "006QL00001BahjGYAR"
                  },
                  "rejectionReason": {
                    "type": "string",
                    "description": "Reason supplied when rejecting an invitation. Optional, and only\nmeaningful when `tackle-operation-id` is `rejectInvitation`. Ignored on\naccept-path requests.",
                    "enum": [
                      "Customer problem unclear",
                      "Next steps unclear",
                      "Unable to support",
                      "Duplicate of Partner Referral",
                      "Renewal opportunity",
                      "Other"
                    ]
                  }
                }
              },
              "examples": {
                "accept": {
                  "summary": "Accept the invitation",
                  "description": "When you are ready to accept the invitation, you will need to include the `acceptInvitation` operation ID in the header. You can also send an optional crmId in the body",
                  "value": {
                    "crmId": "006QL00001BahjGYAR"
                  }
                },
                "reject": {
                  "summary": "Reject the invitation",
                  "description": "If you are unable to accept the invitation, you can reject it. To do so, you will need to include the `rejectInvitation` operation ID in the header.",
                  "value": {
                    "rejectionReason": "Customer problem unclear"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Accepted. The invitation update has been queued for asynchronous processing in AWS\nPartner Central. The response body is empty."
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "423": {
            "$ref": "#/components/responses/Locked"
          },
          "500": {
            "$ref": "#/components/responses/InternalServerError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "MTM JWT",
        "description": "Tackle machine-to-machine access token sent as `Authorization: Bearer <access_token>`."
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Bad Request. The request was malformed or failed validation (for example, an invalid\n`sortField`/`sortOrder` value, an unsupported `tackle-operation-id`, or a request body that\nfails to parse as JSON).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "message": "Invalid sortField"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Unauthorized. The request did not include valid Tackle MTM bearer credentials, or the\nauthenticated principal could not be resolved."
      },
      "NotFound": {
        "description": "Not Found. No resource exists at the requested path for the authenticated vendor.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "message": "Opportunity not found"
            }
          }
        }
      },
      "Locked": {
        "description": "Locked. The request was rejected because the vendor is currently in a mid-reset state\n(for example, while the vendor's AWS Partner Central connection is being re-established).\nRetry the request once the vendor's reset has completed.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "message": "Locked"
            }
          }
        }
      },
      "InternalServerError": {
        "description": "Internal Server Error. An unexpected error occurred while processing the request. Response\nbodies for 5xx errors may be empty."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Error envelope returned for typed error responses. Some 4xx and 5xx responses\n(such as direct `Unauthorized` and `Internal Server Error` responses) may instead\nreturn an empty body; consumers should be tolerant of that.",
        "properties": {
          "message": {
            "type": "string",
            "description": "A short, human-readable description of the error.",
            "example": "Opportunity not found"
          }
        }
      }
    }
  }
}
```