{
  "info": {
    "name": "StrideHQ API (sandbox)",
    "description": "The StrideHQ API 0.1.0, sandbox only. Every request goes to https://api.sandbox.stridehq.ai/v1, which uses demo data, so no real money moves.\n\nBefore you send anything, set the `apiKey` variable to a sandbox key (it starts with `shq_test_`). Create one in your sandbox app under Settings > Developers > API keys. Keep it in the Current value only, so it isn't shared if you export or share the collection.\n\nDocs: https://developers.stridehq.ai",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://api.sandbox.stridehq.ai/v1",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "",
      "type": "secret"
    }
  ],
  "item": [
    {
      "name": "Organisation",
      "description": "",
      "item": [
        {
          "name": "Get your organisation",
          "request": {
            "method": "GET",
            "description": "Returns the organisation the key belongs to, including its fee rate and which features are on.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/organisation",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "organisation"
              ],
              "query": [],
              "variable": []
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Creators",
      "description": "",
      "item": [
        {
          "name": "List creators",
          "request": {
            "method": "GET",
            "description": "Returns your creators, newest first.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/creators",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "creators"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "description": "How many to return. 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "starting_after",
                  "value": "",
                  "description": "The last id from the previous page. Use it when `has_more` is true.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-created_at",
                  "description": "One of `created_at`, `updated_at`, `name`. Prefix with `-` for descending.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only creators with this status.",
                  "disabled": true
                },
                {
                  "key": "can_be_paid",
                  "value": "",
                  "description": "Only creators who can or can't be paid right now.",
                  "disabled": true
                },
                {
                  "key": "created_after",
                  "value": "",
                  "description": "Only those created after this time.",
                  "disabled": true
                },
                {
                  "key": "created_before",
                  "value": "",
                  "description": "Only those created before this time.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Create a creator",
          "request": {
            "method": "POST",
            "description": "Adds a creator. Bank details can't be sent through the API; the creator adds them in StrideHQ. Check with Search creators first to avoid duplicates.\n\nScope: `creators:write`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/creators",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "creators"
              ],
              "query": [],
              "variable": []
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Maya Chen\",\n  \"email\": \"maya@example.com\",\n  \"legal_name\": \"Maya Chen\",\n  \"country\": \"GB\",\n  \"payout_currency\": \"GBP\",\n  \"external_id\": \"talent-1042\",\n  \"metadata\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Search creators",
          "request": {
            "method": "GET",
            "description": "Finds a creator by exact email or external id. Returns at most one creator, so you can check before creating.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/creators/search?email=maya@example.com",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "creators",
                "search"
              ],
              "query": [
                {
                  "key": "email",
                  "value": "maya@example.com",
                  "description": "Exact email address. Not case sensitive.",
                  "disabled": false
                },
                {
                  "key": "external_id",
                  "value": "",
                  "description": "Your own reference for the creator.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Get a creator",
          "request": {
            "method": "GET",
            "description": "Returns one creator, including whether they can be paid right now and why not.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/creators/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "creators",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "cre_8f3a2c1d9b7e4f60a1b2c3d4e5f60718",
                  "description": "The creator's id."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Update a creator",
          "request": {
            "method": "PATCH",
            "description": "Updates the fields you send. Status can't be changed through the API, and email and payout currency can't be changed once the creator has added bank details.\n\nScope: `creators:write`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/creators/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "creators",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "cre_8f3a2c1d9b7e4f60a1b2c3d4e5f60718",
                  "description": "The creator's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Maya Chen\",\n  \"email\": \"maya@example.com\",\n  \"legal_name\": \"Maya Chen\",\n  \"country\": \"GB\",\n  \"payout_currency\": \"GBP\",\n  \"external_id\": \"talent-1042\",\n  \"metadata\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Invoices",
      "description": "",
      "item": [
        {
          "name": "List invoices",
          "request": {
            "method": "GET",
            "description": "Returns your invoices, newest first.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "invoices"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "description": "How many to return. 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "starting_after",
                  "value": "",
                  "description": "The last id from the previous page. Use it when `has_more` is true.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-created_at",
                  "description": "One of `created_at`, `updated_at`, `due_date`, `invoice_date`, `total_amount`. Prefix with `-` for descending.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only invoices with this status.",
                  "disabled": true
                },
                {
                  "key": "creator_id",
                  "value": "",
                  "description": "Only this creator's invoices.",
                  "disabled": true
                },
                {
                  "key": "purchase_order_id",
                  "value": "",
                  "description": "Only invoices against this purchase order.",
                  "disabled": true
                },
                {
                  "key": "payment_run_id",
                  "value": "",
                  "description": "Only invoices in this payment run.",
                  "disabled": true
                },
                {
                  "key": "due_before",
                  "value": "",
                  "description": "Only invoices due before this date.",
                  "disabled": true
                },
                {
                  "key": "created_after",
                  "value": "",
                  "description": "Only those created after this time.",
                  "disabled": true
                },
                {
                  "key": "created_before",
                  "value": "",
                  "description": "Only those created before this time.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Submit an invoice",
          "request": {
            "method": "POST",
            "description": "Submits an invoice as structured fields for a creator you've already added. It waits for review in StrideHQ like an invoice uploaded there, and is matched to your purchase orders. Nothing is approved through the API. Uploading the invoice file through the API is coming later. `Idempotency-Key` is required.\n\nScope: `invoices:write`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/invoices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "invoices"
              ],
              "query": [],
              "variable": []
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"creator_id\": \"cre_8f3a2c1d9b7e4f60a1b2c3d4e5f60718\",\n  \"invoice_number\": \"MC-0042\",\n  \"invoice_date\": \"2026-10-10\",\n  \"due_date\": \"2026-11-09\",\n  \"po_number\": \"PO-2026-118\",\n  \"description\": \"Autumn campaign, 3 videos\",\n  \"net_amount\": 250000,\n  \"vat_amount\": 0,\n  \"total_amount\": 250000,\n  \"currency\": \"GBP\",\n  \"external_id\": \"inv-77810\",\n  \"metadata\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Get an invoice",
          "request": {
            "method": "GET",
            "description": "Returns one invoice, with its purchase order match and where it is in payment.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/invoices/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "invoices",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_4b1e7d2a9c3f4e5d8a6b0c1d2e3f4a5b",
                  "description": "The invoice's id."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Update an invoice",
          "request": {
            "method": "PATCH",
            "description": "Updates an invoice that is `in_review` or `action_required`. Approved invoices can't be changed.\n\nScope: `invoices:write`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/invoices/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "invoices",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_4b1e7d2a9c3f4e5d8a6b0c1d2e3f4a5b",
                  "description": "The invoice's id."
                }
              ]
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"invoice_number\": \"MC-0042\",\n  \"invoice_date\": \"2026-10-10\",\n  \"due_date\": \"2026-11-09\",\n  \"po_number\": \"PO-2026-118\",\n  \"description\": \"Autumn campaign, 3 videos\",\n  \"total_amount\": 250000,\n  \"metadata\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Get the invoice file",
          "request": {
            "method": "GET",
            "description": "Returns a signed link to the invoice file. The link expires after 5 minutes.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/invoices/:id/file",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "invoices",
                ":id",
                "file"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "inv_4b1e7d2a9c3f4e5d8a6b0c1d2e3f4a5b",
                  "description": "The invoice's id."
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Purchase orders",
      "description": "",
      "item": [
        {
          "name": "List purchase orders",
          "request": {
            "method": "GET",
            "description": "Returns the purchase orders synced from your purchase order spreadsheet.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/purchase_orders",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "purchase_orders"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "description": "How many to return. 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "starting_after",
                  "value": "",
                  "description": "The last id from the previous page. Use it when `has_more` is true.",
                  "disabled": true
                },
                {
                  "key": "po_number",
                  "value": "",
                  "description": "Exact purchase order number.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "`open` or `closed`.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Get a purchase order",
          "request": {
            "method": "GET",
            "description": "Returns one purchase order, with how much has been invoiced against it.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/purchase_orders/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "purchase_orders",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "po_2d4f6a8b0c1e3a5b7d9f1a2b3c4d5e6f",
                  "description": "The purchase order's id."
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Payment runs",
      "description": "",
      "item": [
        {
          "name": "List payment runs",
          "request": {
            "method": "GET",
            "description": "Returns your payment runs, newest first.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment_runs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment_runs"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "description": "How many to return. 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "starting_after",
                  "value": "",
                  "description": "The last id from the previous page. Use it when `has_more` is true.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "-created_at",
                  "description": "One of `created_at`, `updated_at`, `total_amount`. Prefix with `-` for descending.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only runs with this status.",
                  "disabled": true
                },
                {
                  "key": "created_after",
                  "value": "",
                  "description": "Only those created after this time.",
                  "disabled": true
                },
                {
                  "key": "created_before",
                  "value": "",
                  "description": "Only those created before this time.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Prepare a payment run",
          "request": {
            "method": "POST",
            "description": "Prepares a run from approved invoices, by id or by rules. Invoices that can't be paid are left out, each with a reason in `skipped`. The run waits for a person to approve it in StrideHQ; no key can approve, fund or pay. `Idempotency-Key` is required.\n\nScope: `payment_runs:prepare`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payment_runs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment_runs"
              ],
              "query": [],
              "variable": []
            },
            "body": {
              "mode": "raw",
              "raw": "{\n  \"invoice_ids\": [\n    \"inv_4b1e7d2a9c3f4e5d8a6b0c1d2e3f4a5b\"\n  ],\n  \"due_within_days\": 7,\n  \"include_overdue\": true,\n  \"currency\": \"GBP\",\n  \"limit_amount\": 1000000,\n  \"notes\": \"Weekly creator payments\",\n  \"metadata\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "Get a payment run",
          "request": {
            "method": "GET",
            "description": "Returns one run with its totals, fees, what was skipped and how much has been received.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment_runs/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment_runs",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "run_3e5a7c9b1d2f4a6c8e0b2d4f6a8c0e1d",
                  "description": "The payment run's id."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Withdraw a payment run",
          "request": {
            "method": "POST",
            "description": "Withdraws a run that is still `pending_approval`. Its invoices go back to `approved`.\n\nScope: `payment_runs:prepare`",
            "header": [
              {
                "key": "Idempotency-Key",
                "value": "{{$guid}}",
                "description": "A unique value, such as a UUID. The same key and body within 24 hours returns the original response.",
                "disabled": false
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payment_runs/:id/withdraw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment_runs",
                ":id",
                "withdraw"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "run_3e5a7c9b1d2f4a6c8e0b2d4f6a8c0e1d",
                  "description": "The payment run's id."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "Get remittance advice",
          "request": {
            "method": "GET",
            "description": "Returns a signed link to the run's remittance advice PDF, once it has paid payments. The link expires after 5 minutes.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payment_runs/:id/remittance_advice",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment_runs",
                ":id",
                "remittance_advice"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "run_3e5a7c9b1d2f4a6c8e0b2d4f6a8c0e1d",
                  "description": "The payment run's id."
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Payments",
      "description": "",
      "item": [
        {
          "name": "List payments",
          "request": {
            "method": "GET",
            "description": "Returns payments, one per creator per run, newest first.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "description": "How many to return. 1 to 100.",
                  "disabled": true
                },
                {
                  "key": "starting_after",
                  "value": "",
                  "description": "The last id from the previous page. Use it when `has_more` is true.",
                  "disabled": true
                },
                {
                  "key": "payment_run_id",
                  "value": "",
                  "description": "Only payments in this run.",
                  "disabled": true
                },
                {
                  "key": "creator_id",
                  "value": "",
                  "description": "Only payments to this creator.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Only payments with this status.",
                  "disabled": true
                }
              ],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "Get a payment",
          "request": {
            "method": "GET",
            "description": "Returns one payment, with the exchange rate used and why it failed, if it did.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payments/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments",
                ":id"
              ],
              "query": [],
              "variable": [
                {
                  "key": "id",
                  "value": "pay_7c9e1a3b5d7f4a2c8e0b1d3f5a7c9e1b",
                  "description": "The payment's id."
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Reference data",
      "description": "",
      "item": [
        {
          "name": "List currencies",
          "request": {
            "method": "GET",
            "description": "Every currency StrideHQ can pay out in, with whether each is switched on for your organisation. Others can be switched on on request.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/reference/currencies",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "reference",
                "currencies"
              ],
              "query": [],
              "variable": []
            }
          },
          "response": []
        },
        {
          "name": "List countries",
          "request": {
            "method": "GET",
            "description": "Every country StrideHQ can pay creators in, with whether each is switched on for your organisation.\n\nScope: `read`",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/reference/countries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "reference",
                "countries"
              ],
              "query": [],
              "variable": []
            }
          },
          "response": []
        }
      ]
    }
  ]
}
