Free Link-In-Bio Page Builder

Free Link-In-Bio Page Builder · Actions GPT

SupaDrop GPT Facade API

Create an anonymous SupaDrop release page and return the live public URL plus the secret edit URL. Designed for a Custom GPT action.

  • POST /api/gpt/supadrop/createCreate a SupaDrop release page

    Creates one anonymous SupaDrop release page. Use one idempotency key per logical create request. On a safe replay of the same request, the API returns the same page and the same secret edit URL.

Schéma original API
{
  "openapi": "3.1.1",
  "info": {
    "title": "SupaDrop GPT Facade API",
    "version": "1.0.0",
    "description": "Create an anonymous SupaDrop release page and return the live public URL plus the secret edit URL. Designed for a Custom GPT action.\n"
  },
  "servers": [
    {
      "url": "https://supafan.to"
    }
  ],
  "paths": {
    "/api/gpt/supadrop/create": {
      "post": {
        "operationId": "createSupaDropPage",
        "summary": "Create a SupaDrop release page",
        "description": "Creates one anonymous SupaDrop release page. Use one idempotency key per logical create request. On a safe replay of the same request, the API returns the same page and the same secret edit URL.\n",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateSupaDropRequest"
              },
              "examples": {
                "minimal": {
                  "summary": "Minimal valid request",
                  "value": {
                    "idempotency_key": "chatgpt-run-001",
                    "artist_name": "Neon Tigers",
                    "release_title": "Midnight Receiver",
                    "status_badge": "out_now",
                    "primary_link": {
                      "label": "Listen now",
                      "url": "https://example.com/listen"
                    },
                    "anonymous_terms_accepted": true
                  }
                },
                "fuller": {
                  "summary": "Request with optional fields",
                  "value": {
                    "idempotency_key": "chatgpt-run-002",
                    "artist_name": "Neon Tigers",
                    "release_title": "Midnight Receiver",
                    "status_badge": "out_now",
                    "artist_note": "New single out now. Thanks for listening.",
                    "primary_link": {
                      "label": "Listen now",
                      "url": "https://example.com/listen"
                    },
                    "streaming_links": [
                      {
                        "label": "Spotify",
                        "url": "https://open.spotify.com/track/example"
                      },
                      {
                        "label": "Apple Music",
                        "url": "https://music.apple.com/album/example"
                      }
                    ],
                    "youtube_video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
                    "secondary_links": [
                      {
                        "label": "Merch",
                        "url": "https://example.com/merch"
                      }
                    ],
                    "anonymous_terms_accepted": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Idempotent replay of an already-created result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateSupaDropResponse"
                },
                "examples": {
                  "replay": {
                    "value": {
                      "status": "created",
                      "idempotent_replay": true,
                      "release_page_id": 123,
                      "short_id": "7sqylbgdhx",
                      "public_url": "https://drop.supafan.to/r/7sqylbgdhx",
                      "edit_url": "https://drop.supafan.to/e/7sqylbgdhx/SECRET_TOKEN",
                      "expires_at": "2026-07-01T12:34:56Z"
                    }
                  }
                }
              }
            }
          },
          "201": {
            "description": "Newly created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateSupaDropResponse"
                },
                "examples": {
                  "created": {
                    "value": {
                      "status": "created",
                      "idempotent_replay": false,
                      "release_page_id": 123,
                      "short_id": "7sqylbgdhx",
                      "public_url": "https://drop.supafan.to/r/7sqylbgdhx",
                      "edit_url": "https://drop.supafan.to/e/7sqylbgdhx/SECRET_TOKEN",
                      "expires_at": "2026-07-01T12:34:56Z"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "unauthorized": {
                    "value": {
                      "message": "Unauthorized."
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Idempotency conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IdempotencyConflictResponse"
                },
                "examples": {
                  "key_reused": {
                    "value": {
                      "message": "This idempotency key was already used with a different request payload.",
                      "error_code": "idempotency_key_reused_with_different_payload"
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValidationErrorResponse"
                },
                "examples": {
                  "invalid_url": {
                    "value": {
                      "message": "The given data was invalid.",
                      "errors": {
                        "primary_link.url": [
                          "The primary link url field must be a valid URL."
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "throttled": {
                    "value": {
                      "message": "Too many requests."
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "internal": {
                    "value": {
                      "message": "An unexpected error occurred."
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "APIKey"
      }
    },
    "schemas": {
      "LinkInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "label",
          "url"
        ],
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 60,
            "description": "Short button label shown on the release page."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048,
            "description": "Must use http or https."
          }
        }
      },
      "CreateSupaDropRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "idempotency_key",
          "artist_name",
          "release_title",
          "status_badge",
          "primary_link",
          "anonymous_terms_accepted"
        ],
        "properties": {
          "idempotency_key": {
            "type": "string",
            "maxLength": 255,
            "description": "Unique key for safe request replay."
          },
          "artist_name": {
            "type": "string",
            "maxLength": 120
          },
          "release_title": {
            "type": "string",
            "maxLength": 160
          },
          "status_badge": {
            "type": "string",
            "enum": [
              "pre_save",
              "out_now",
              "watch"
            ],
            "description": "pre_save = pre-save campaign, out_now = live release, watch = watch/listen campaign.\n"
          },
          "artist_note": {
            "type": "string",
            "nullable": true,
            "maxLength": 500
          },
          "primary_link": {
            "$ref": "#/components/schemas/LinkInput"
          },
          "streaming_links": {
            "type": "array",
            "maxItems": 12,
            "items": {
              "$ref": "#/components/schemas/LinkInput"
            }
          },
          "youtube_video_url": {
            "type": "string",
            "nullable": true,
            "maxLength": 2048,
            "description": "Valid YouTube URL or YouTube video id."
          },
          "secondary_links": {
            "type": "array",
            "maxItems": 3,
            "items": {
              "$ref": "#/components/schemas/LinkInput"
            }
          },
          "anonymous_terms_accepted": {
            "type": "boolean",
            "description": "Must be true."
          }
        }
      },
      "CreateSupaDropResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "status",
          "idempotent_replay",
          "release_page_id",
          "short_id",
          "public_url",
          "edit_url",
          "expires_at"
        ],
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "created"
            ]
          },
          "idempotent_replay": {
            "type": "boolean"
          },
          "release_page_id": {
            "type": "integer"
          },
          "short_id": {
            "type": "string"
          },
          "public_url": {
            "type": "string",
            "format": "uri"
          },
          "edit_url": {
            "type": "string",
            "format": "uri"
          },
          "expires_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "type": "string"
          }
        }
      },
      "IdempotencyConflictResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "message",
          "error_code"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "error_code": {
            "type": "string"
          }
        }
      },
      "ValidationErrorResponse": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "message",
          "errors"
        ],
        "properties": {
          "message": {
            "type": "string"
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}