---
title: "Set a link's routing rules"
method: POST
path: "/urls/{code}/routing"
tags: ["Routing Rules"]
---

# Set a link's routing rules

`POST /urls/{code}/routing`

## Request

- Base URL: `https://gajo.io/api/v1`
- URL: `https://gajo.io/api/v1/urls/{code}/routing`
- Auth: API key in header `x-api-key`

**Requires a Pro plan.** Sets one-off device or A/B rules on a single link, replacing any rules it already has. All rules in a request must share one `ruleType`. `Device` rules take a `deviceType` of `Mobile`, `Tablet` or `Desktop` (each at most once). `AbTest` rules need a `variantName` and a `splitPercentage` of at least 1, summing to 100. For reusable setups, prefer route/A/B templates and bindings.

## Request body

- CreateRoutingRulesRequest
  - `rules` RoutingRuleInput[], required: One or more rules, all with the same `ruleType`.
    - `ruleType` 'Device' | 'AbTest', required: `Device` routes by device class; `AbTest` splits traffic by percentage.
    - `deviceType` 'Mobile' | 'Tablet' | 'Desktop': Device class for per-URL `Device` rules.
    - `targetUrl` string, required: Destination URL (standard web schemes; validated like `POST /shorten`).
    - `variantName` string: Required for `AbTest` rules.
    - `splitPercentage` integer: Required for `AbTest` rules; all percentages in the request must sum to 100.

## Response `200`

The rules that were created.

- RoutingRulesCreatedResult: Envelope shared by every response.
  - `success` true, required: `true` when the request succeeded.
  - `message` string, nullable: Human-readable status or error message. Often `null` on reads.
  - `data` object, required: Operation-specific payload; `null` or absent when there is nothing to return.
    - `shortCode` string, required
    - `ruleType` 'Device' | 'AbTest', required: `Device` routes by device class; `AbTest` splits traffic by percentage.
    - `rules` RoutingRule[], required: The rules created by this request.
      - `id` integer, required: Rule ID, used by `PUT`/`DELETE /urls/{code}/routing/{ruleId}`.
      - `ruleType` 'Device' | 'AbTest', required: `Device` routes by device class; `AbTest` splits traffic by percentage.
      - `priority` integer, required: Position within the batch the rule was created in (0-based).
      - `active` boolean, required
      - `deviceType` 'Mobile' | 'Tablet' | 'Desktop', required: Device class for per-URL `Device` rules.
      - `targetUrl` string, required: Destination for matching clicks.
      - `variantName` string, nullable, required: Set on `AbTest` rules.
      - `splitPercentage` integer, nullable, required: Set on `AbTest` rules.
      - `createdDate` string, date-time, required

## Other responses

- `400`: Invalid request. `message` explains what to fix.
- `401`: The `x-api-key` header is missing, or the key is unknown or revoked.
- `403`: Your plan is not Pro (the message names the Pro feature).
- `404`: No link with this code exists on your account.
- `429`: Per-minute rate limit exceeded. Wait `Retry-After` seconds.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/gajo/apis/gajo-api.md) · [All operations](https://skmtc.dev/gajo/apis/gajo-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gajo/apis/gajo-api/revisions/de6fe920cc26?raw)
